<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.itcollege.ee/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ssaks</id>
	<title>ICO wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.itcollege.ee/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ssaks"/>
	<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php/Special:Contributions/Ssaks"/>
	<updated>2026-05-07T00:04:52Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=101117</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=101117"/>
		<updated>2016-01-30T16:09:13Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://azure.microsoft.com/en-us/services/app-service/web/ Azure Web App]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-20.01.2016&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NB! Serveriga suhtlus registreerimisel/sisse logimisel võib aeglane olla, kuna Azure teeb automaatse shutdowni tasuta virtuaalmasinatele kui x aega pole kasutatud.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*WPF rakendamiseks oleks võinud kasutada mingit valmis raamistikku, näiteks [http://caliburnmicro.com/ Caliburn Micro] või [http://www.mvvmlight.net/ MVVM Light Toolkit]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100847</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100847"/>
		<updated>2016-01-22T10:44:22Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://azure.microsoft.com/en-us/services/app-service/web/ Azure Web App]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NB! Serveriga suhtlus registreerimisel/sisse logimisel võib aeglane olla, kuna Azure teeb automaatse shutdowni tasuta virtuaalmasinatele kui x aega pole kasutatud.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*WPF rakendamiseks oleks võinud kasutada mingit valmis raamistikku, näiteks [http://caliburnmicro.com/ Caliburn Micro] või [http://www.mvvmlight.net/ MVVM Light Toolkit]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100820</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100820"/>
		<updated>2016-01-21T12:10:13Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Projekti kirjeldus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://azure.microsoft.com/en-us/services/app-service/web/ Azure Web App]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*WPF rakendamiseks oleks võinud kasutada mingit valmis raamistikku, näiteks [http://caliburnmicro.com/ Caliburn Micro] või [http://www.mvvmlight.net/ MVVM Light Toolkit]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100819</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100819"/>
		<updated>2016-01-21T11:01:34Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*WPF rakendamiseks oleks võinud kasutada mingit valmis raamistikku, näiteks [http://caliburnmicro.com/ Caliburn Micro] või [http://www.mvvmlight.net/ MVVM Light Toolkit]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100818</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100818"/>
		<updated>2016-01-21T10:54:29Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100817</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100817"/>
		<updated>2016-01-21T10:54:05Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna.&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100816</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100816"/>
		<updated>2016-01-21T10:48:52Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna. Pakuks et arenduse käigus 80% ajast kulus puhtalt WPF probleemide lahendamisele.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*WPF asemel kasutada Winforms või HTML5 kasutajaliidest. Oleks kiirendanud arendusprotsessi kordades, ning arvatavasti oleks lõpptulemus olnud palju täielikum.&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*TFS asemel oleks pidanud Git-i kasutama.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100815</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100815"/>
		<updated>2016-01-21T10:48:14Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna. Pakuks et arenduse käigus 80% ajast kulus puhtalt WPF probleemide lahendamisele.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*WPF asemel kasutada Winforms või HTML5 kasutajaliidest. Oleks kiirendanud arendusprotsessi kordades, ning arvatavasti oleks lõpptulemus olnud palju täielikum.&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*TFS asemel oleks pidanud Git-i kasutama.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Failid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100814</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100814"/>
		<updated>2016-01-21T10:48:01Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna. Pakuks et arenduse käigus 80% ajast kulus puhtalt WPF probleemide lahendamisele.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*WPF asemel kasutada Winforms või HTML5 kasutajaliidest. Oleks kiirendanud arendusprotsessi kordades, ning arvatavasti oleks lõpptulemus olnud palju täielikum.&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*TFS asemel oleks pidanud Git-i kasutama.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - Rakenduse kliendi äriloogika&lt;br /&gt;
* Karina Egipt - Rakenduse kliendi kasutajaliides&lt;br /&gt;
* Silver Saks - Andmebaasidega suhtlus, server ja serveriga ühenduvus&lt;br /&gt;
* Erika Ehmann - Rakenduse kliendi kasutajaliides sisselogimiseks ja registreerimiseks, ning ainete otsing&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100813</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100813"/>
		<updated>2016-01-21T10:42:43Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kommentaarid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et olime endale seadnud pisut liiga ambitsioonika eesmärgi. Lõpptoode täidab umbes pooled meie seatud funktsionaalsetest nõuetest, kuid kindlasti ei ole tegu sellise rakendusega nagu me oma analüüsi tulemusena ette kujutasime. Leiame, et tegu on aine seisukohalt õnnestunud tööga, kuna kasutasime kõiki aine omandamiseks vajalikke tehnoloogiad ning arendusmustreid. Töö tulemusena õppisime kõik väga palju nii C#, OOP programmeerimise, kui ka meeskonnatööna valmivate programmeerimisprojektide kohta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoote kirjeldus&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Juhul kui soovitakse rakenduse serverit testida Visual Studios, siis täieliku funktsionaalsuse saavutamiseks tuleb web.config failis asendada andmebaasi connectionstring mingi muuga. Kasutusel on MySQL andmebaas, kuid ka muud andmebaasid peaks töötama, selleks tuleb ainult vahetada SimpleCRUD.Dialect väärtus koodis. Connectionstringi kustutasin, kuna server on publishitud ja töötab Azure pilveteenuses, ning connectionstringis olid minu isiklikud paroolid.&lt;br /&gt;
&lt;br /&gt;
Klient peaks töötama kohalikus arvutis täielikult ja automaatselt. Esimese sammuna tuleb endale kasutaja luua, ning seejärel loodud kasutajaga sisse logida. Passwordi kastides ei saa kasutada backspace ega delete nuppe, kuna need on lahendatud aja puuduse tõttu pisut ebakorrektselt. Ainus info mis hetkel serverist tuleb on õppeainete nimekiri. Programmi kasutamist on kirjeldatud ka kasutusjuhendis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arenduse käigus tekkinud probleemid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
WPF ja MVVM olid ise õppimiseks väga keerulised, kindlasti tuleks koolis praktikatundides nende õpetamisele rohkem rõhku panna. Pakuks et arenduse käigus 80% ajast kulus puhtalt WPF probleemide lahendamisele.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mida oleks võinud teistmoodi teha&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*WPF asemel kasutada Winforms või HTML5 kasutajaliidest. Oleks kiirendanud arendusprotsessi kordades, ning arvatavasti oleks lõpptulemus olnud palju täielikum.&lt;br /&gt;
*Antud rakenduse realiseerimiseks oleks täielikult veebirakenduse tegemine olnud parem lahendus.&lt;br /&gt;
*TFS asemel oleks pidanud Git-i kasutama.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100811</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100811"/>
		<updated>2016-01-21T00:05:52Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Lõpptoode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=a4d3d913c6a56037e71688be767d8800 Rakenduse Kasutusjuhend]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=100810</id>
		<title>Juhend: Kodutöö aines &quot;Programmeerimine CSharp keeles&quot; (2015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=100810"/>
		<updated>2016-01-21T00:04:43Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Meeskond: Spooky Scary Skeletons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
=Kodutöö aines &amp;quot;Programmeerimine C# keeles&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
==Eesmärk==&lt;br /&gt;
Saada praktiline arenduskogemus .NET keskkonnas ning arendada meeskonnatöö kogemust ja analüüsivõimet. Kasutada arendusprotsessis koodihoidlat.&lt;br /&gt;
&lt;br /&gt;
==Reeglid==&lt;br /&gt;
Ühte projektimeeskonda kuulub 3-5 tudengit(Soovituslik meeskonna suurus on 3-4). Ühel teemal võib teostada projekti üks või mitu meeskonda.Töö käiku kajastatakse https://wiki.itcollege.ee keskkonnas või soovi korral võib seda teha ka ajaveebis(blogis).&lt;br /&gt;
Ajaveebi pidamise eesmärke on kaks: nii on võimalik kirja panna kõik mõtted ja ideed (ning nendest jääb jälg ja dokumentatsioon) ning õppejõul on hiljem võimalik saada ülevaade iga projektimeeskonna liikme panusest. Ajaveebi loob ja ajaveebi haldab projektimeeskond vabalt valitud (avalikus) keskkonnas. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekti loomine ja arendamine &#039;&#039;&#039;&lt;br /&gt;
Projekt lisatakse versioonihaldusesse, kasutades selleks [Team Foundation Service&#039;it http://tfs.visualstudio.com/] ning õppejõule antakse ligipääs. Õppejõu live id: maitposka ät hotmail.com . Projekt peab olema alates algfaasist lisatud TFSi ning kogu tööprotsess toimub versioonihaldust kasutades&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööde esitamine&#039;&#039;&#039; (prototüüb ja lõpptoode)&lt;br /&gt;
Töö esitamisel pakitakse see kokku ning lisatakse wiki leheküljele link lähtekoodile. Kui töö lähtekoodi ei soovita mingil põhjusel avalikustata, tuleb õppejõuga selle jaoks sõlmida eraldi kokkulepe. Lähtekood on vajalik, et tööd oleks võimalik hinnata nii õppejõul kui kaastudengitel selle kohta retsensiooni kirjutada.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Team Foundation Service kasutamine&#039;&#039;&#039; (tänasel päeval &#039;&#039; Visual Studio online&#039;&#039;)&lt;br /&gt;
[http://www.visualstudio.com/get-started/sign-up-for-visual-studio-online Step-by-Step juhend]&lt;br /&gt;
&lt;br /&gt;
NB! Siia tuleb õppejõu poolt lihtne screencast ka, kuid ideeliselt ei tohiks selle kasutamine olla väga keeruline.&lt;br /&gt;
&lt;br /&gt;
==Tähtaegadest kinnipidamine==&lt;br /&gt;
Projekt jaguneb alamosadeks, millele on määratud tähtajad. Tähtaegade ületamisel võimalike punkte ei kaotata. Kui töö aga on esitatud tähtajaks, siis on võimalik selle eest teenida boonuspunkte (enamasti 0-10% võimalikust maksimumist boonust). Enne tähtaega esitatud töö ei tähenda automaatselt maksimumpunkte, kui see ei ole sooritatud korralikult.&lt;br /&gt;
&lt;br /&gt;
==Hindamine==&lt;br /&gt;
Teostatuks loetakse projekt juhul, kui lähteülesanne on realiseeritud, lahendus on töötav, kuid esineb suuremaid vigu ning piirsituatsioonidega ei ole arvestatud.&lt;br /&gt;
Maksimumtulemuse saavutamiseks peab projekt olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus. Tehnilisi ja vormistuslike puudujääke on võimalik korvata lisavõimaluste realiseerimisega.Üldjuhul tuleb loodud lahendust ka praktikumides või loengutes teistele tudengitele tutvustada (ca 10 min).&lt;br /&gt;
Nagu eelpool mainitud, koosneb projekt erinevatest osadest. Punktide arvu määramisel arvestatakse ka tähtajast kinni pidamist, mille toimimisloogika on kirjeldatud eespool.&lt;br /&gt;
&lt;br /&gt;
===Meeskonna kokkupanek ja idee===&lt;br /&gt;
&#039;&#039;&#039;25.10.2015&#039;&#039;&#039; (2p)&lt;br /&gt;
&lt;br /&gt;
Tekitatakse meeskonna wiki lehekülg. Meeskonnal peab olema nimi ning see koosneb  kolmest kuni viiest liikmest. Määratakse projektijuht. Juhul kui hakatakse blogi pidama kuskil mujal keskkonnas ilmub selle kohta link. Lühidalt peaks kirjeldama idee olemust nii, et selle üldine suund oleks arusaadav. Samuti peab olema märgitud tehnoloogia, milles hakatakse rakendust looma. Meeskond on loonud TFSi konto ning on saatnud õppejõule kutse.&lt;br /&gt;
&lt;br /&gt;
===Analüüs===&lt;br /&gt;
&#039;&#039;&#039;01.11.2015&#039;&#039;&#039; (6p)&lt;br /&gt;
Analüütilise osa eesmärgiks on arendada tudengite analüüsioskust, mida on vaja ka päris tarkvaraarenduse protsessi juures.&#039;&#039;&#039;NB! Miinimum sõnade arv 700&#039;&#039;&#039; Selle osa käigus peab valmima loodava rakenduse analüüs, mis sisaldab muu hulgas ka:&lt;br /&gt;
*Analüüs rakendusele. (Mida see endas sisaldab? Mis on selle eesmärk? Mida tavakasutaja sellega teha saaks? Milliste osade realiseerimine võib osutuda problemaatiliseks?) Kui on tööjaotus paigas, siis tuua ka see välja.&lt;br /&gt;
*Tuua välja nimekiri funktsionaalsusest, mida plaanitakse kindlasti teostada(&#039;&#039;Must have&#039;&#039;)&lt;br /&gt;
*Nimekiri funktsionaalsustest, mis võiks olla, aga mida ei pruugita ajapuuduse tõttu realiseerida.(&#039;&#039;Nice to have&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 8.11.2015 (3p)&lt;br /&gt;
&lt;br /&gt;
===Prototüüp===&lt;br /&gt;
&#039;&#039;&#039;13.12.2015 23:58&#039;&#039;&#039;(10p)&lt;br /&gt;
&lt;br /&gt;
Valmib projekti esmane realisatsioon. Laias laastus on peafunktsionaalsused realiseeritud(Nimekiri funktsionaalsusest, mida plaanitakse teostada).  Programmis võib esineda üksikuid, kuid mitte väga suuri vigu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 20.12.2015(5p)&lt;br /&gt;
&lt;br /&gt;
===Lõpptoode===&lt;br /&gt;
&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;(20p)&lt;br /&gt;
Selleks faasiks peab projekt maksimumpuntkide saavutamiseks olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 27.01.2016(5p)&lt;br /&gt;
&lt;br /&gt;
===Esitlus/Kaitsmine=== &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Toimub loengutes/praktikumides või kokkulepitud ajal enne eksamit&#039;&#039;&#039; &#039;&#039;(4p) &#039;&#039;&lt;br /&gt;
Esitlusel kaitstakse projekti. Tutvustatakse tehnoloogiat, mida kasutati rakenduse realiseerimiseks.  Lühidalt räägitakse tööjaotusest ning probleemidest, mis tekkisid projekti realiseerimisel. Näidatakse lähtekoodi ja demonstreeritakse oma rakendust teistele tudengitele, kes võivad selle kohta küsimusi küsida. Kestvus ~20min.&lt;br /&gt;
&lt;br /&gt;
====Kaitsmise ajad====&lt;br /&gt;
&lt;br /&gt;
Tere, iga aja taha kirjutada meeskonna nimi, kes tuleb oma tööd kaitsma. Aegu palun täita võimaluse korral järjest.&lt;br /&gt;
&lt;br /&gt;
Ideaalne esitlus, sisaldab endas ka powerpointi, kus on&lt;br /&gt;
*väljatoodud meeskonna nimi ja liikmed&lt;br /&gt;
*idee&lt;br /&gt;
*realiseerimine&lt;br /&gt;
*mis oli keerukas?&lt;br /&gt;
*mida uut õpiti?&lt;br /&gt;
*mõnede keerulisemate probleemide lahendamine&lt;br /&gt;
*meeskonnaliikmete panus&lt;br /&gt;
&lt;br /&gt;
Kaitsmise käigus vaadatakse üle ka kood.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Esmaspäev&#039;&#039;&#039; - 14.12.2015&lt;br /&gt;
*14:00 - [https://wiki.itcollege.ee/index.php?title=Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
*14:15 -&lt;br /&gt;
*14:30 - &lt;br /&gt;
*14:45 -&lt;br /&gt;
*15:00 - Incman&lt;br /&gt;
*15:15 - &lt;br /&gt;
&lt;br /&gt;
*16:00 - &lt;br /&gt;
*16:15 - [[Meeskond: Travo]]&lt;br /&gt;
*16:30 - GlobalElite&lt;br /&gt;
*16:45 - [https://wiki.itcollege.ee/index.php/BIT BIT]&lt;br /&gt;
*17:00 - &lt;br /&gt;
*17:15 - KTM Development&lt;br /&gt;
*17:30 - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neljapäev&#039;&#039;&#039; - 17.12.2015&lt;br /&gt;
*08:15 - VVA&lt;br /&gt;
*08:30 - mc2&lt;br /&gt;
*08:45 - &lt;br /&gt;
*09:00 - Sporto&lt;br /&gt;
*09:15 - MinuKV&lt;br /&gt;
*09:30 - &lt;br /&gt;
&lt;br /&gt;
*10:00 -Kodune raamat&lt;br /&gt;
*10:15 - &lt;br /&gt;
*10:30 - MSI&lt;br /&gt;
*10:45 -&lt;br /&gt;
*11:00 - Lebokeiss OÜ&lt;br /&gt;
*11:15 - OKVaatame&lt;br /&gt;
&lt;br /&gt;
=Teemad 2015 sügis=&lt;br /&gt;
Kodutööna tuleb luua:&lt;br /&gt;
&lt;br /&gt;
==Nõuded rakendusele==&lt;br /&gt;
Loodav rakendus peab:&lt;br /&gt;
* Peab kasutama andmebaasi (erikokkuleppel ka XML formaadis andmeallikat)&lt;br /&gt;
**Andmebaasis peab olema vähemalt 6 andmebaasi tabelit&lt;br /&gt;
* Peab võimaldama tegevuste kohta registri pidamist (logi)&lt;br /&gt;
**Rakenduses tehtavad tegevused salvestatakse&lt;br /&gt;
* Kasutama kasutajaliidesena ühte järgmistest: Windows Presentation Foundation, Windows Phone , Windows Store App või ASP.Net&lt;br /&gt;
* Kood on kommenteeritud ning rakendus on varustatud dokumentatsiooniga&lt;br /&gt;
* Maksimumpunktide jaoks kasutatakse vastavalt valitud tehnoloogiale soovitatud arendusmustreid&lt;br /&gt;
* Kood on kirjutatud C# programmeerimiskeeles&lt;br /&gt;
**Kuna aine nimi on &amp;quot;Programmeerimine C# keeles&amp;quot; ei tohi esitada rakendust, mis on loodud Javas, PHPs vms keeles&lt;br /&gt;
* Rakendus on jaotatud kihtidesse&lt;br /&gt;
&#039;&#039;&#039;Loodav rakendus peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
*Kood on kommenteeritud&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea äriidee&lt;br /&gt;
&lt;br /&gt;
==Kodune raamatukogu==&lt;br /&gt;
Kodudes on tihti erinevaid raamatuid (filme, muud nänni) ja sõbrad tahavad neid vahel laenutada.&lt;br /&gt;
Loo rakendus, mis&lt;br /&gt;
* Võimaldaks sisestada kodused raamatud&lt;br /&gt;
* Võimaldaks luua laenutajate profiile&lt;br /&gt;
* Raamatuid välja laenutada (tähtajaliselt)&lt;br /&gt;
* Laseks koostada erinevaid aruandeid (kodusolevad raamatud, väljalaenutatud raamatud, tähtaja ületanud laenutused  jne)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Kui laenutaja profiilis on e-mail, siis saada automaatselt e-kiri „kallis sõber see ja see, Sinu käes on minu raamat, kas tood tagasi ka?”&lt;br /&gt;
* Kuva hoiatused, kui laenutaja laenutuste ajalugu on vilets või kui mõni raamat on tagastamata.&lt;br /&gt;
* Lase lisada raamatutele pilt&lt;br /&gt;
* Loo lihtne veebiliides (et sõbrad saaksid veebist vaadata, mis raamatud kasutajal  kodus veel alles on)&lt;br /&gt;
Või&lt;br /&gt;
&lt;br /&gt;
==CRM==&lt;br /&gt;
Oma klientidest peab olema ülevaade.&lt;br /&gt;
Loo rakendus, mis võimaldab:&lt;br /&gt;
* Kliente ning nende kontaktisikuid sisestada, muuta ning kustutada&lt;br /&gt;
* Võimalda sisestada kliendikontakte&lt;br /&gt;
* Koostada hinnapakkumisi klientidele, kusjuures hinnapakkumine lisatakse süsteemi ka kui kliendikontakt ning saadetakse samast süsteemist kliendile.&lt;br /&gt;
* Kliendi andmete vaatamisel kuvatakse ka kliendikontaktid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Loo võimalus, kus kontaktisiku sünnipäeva saabumisel saadetakse automaatselt inimesele meil õnnesoovidega&lt;br /&gt;
* Õnnitlusmeilide template’sid võiks olla mitu&lt;br /&gt;
* Loo võimalus kliendi huvide (huvialade) kajastamiseks süsteemis&lt;br /&gt;
&lt;br /&gt;
==Mäng(Unit)==&lt;br /&gt;
Loodav mäng peab sisaldama:&lt;br /&gt;
* Erinevaid tasemeid&lt;br /&gt;
* Punktiarvestust&lt;br /&gt;
* XBox puldi tuge&lt;br /&gt;
* Klaviatuurilt juhtimise tuge&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loodav mäng peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea &#039;&#039;story&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Meeskonnad 2015=&lt;br /&gt;
==Päevaõpe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MinuKV===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Luik&lt;br /&gt;
*Ahto Elken&lt;br /&gt;
*Silver Ohlo&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MinuKV]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_mc2#Retsensioon_mc2_meeskonna_anal.C3.BC.C3.BCsist siin].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meeskonna MinuKV lõpptoode asub [http://enos.itcollege.ee/~sohlo/MinuKV.7z siin] ja juhend wiki meeskonna kodulehel.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Travo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarvo Reinpalu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Travo]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Lebokeiss_OÜ Retsensioon meeskonna Lebokeiss OÜ rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Lebokeiss_OÜ Retsensioon meeskonna Lebokeiss OÜ rakenduse prototüübile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Freshmen===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Haas - Projektijuht&lt;br /&gt;
*Piret Pomerants&lt;br /&gt;
*Semjon Greef &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Freshmen Freshmen]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Retsensioon Qlibrium analüüsi [https://wiki.itcollege.ee/index.php/Talk:Qlibrium kohta]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: mc2===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Betlem&lt;br /&gt;
*Johannes Tamm&lt;br /&gt;
*Martin Mägi&lt;br /&gt;
*Jana Pipar &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: mc2]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_MinuKV_kohta#Retsensioon_MinuKV_kohta Retsensioon MinuKV kohta]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_ruhmaVVAprototuubikohta Retsensioon rühma VVA prototüübi kohta]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meie prototüüp asub [https://wiki.itcollege.ee/index.php/Meeskond:_mc2#Protot.C3.BC.C3.BCp SIIN]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sporto===&lt;br /&gt;
Liikmed ja panus projekti:&lt;br /&gt;
*Kelli Lukas 100%&lt;br /&gt;
*Vladimir Rõkovanov 100%&lt;br /&gt;
*Alar Ameerikas 100%&lt;br /&gt;
*Mikk Raudsepp 100%&lt;br /&gt;
Meeskonna koduleht (&#039;&#039;&#039;Dokumentatsioon&#039;&#039;&#039;): [https://wiki.itcollege.ee/index.php/Sporto  Sporto]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti prototüübile]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://onedrive.live.com/redir?resid=B04DA53E21E8691B!30244&amp;amp;authkey=!AO2gXYl6yrrc1HM&amp;amp;ithint=file%2c7z Laadi alla]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://1drv.ms/1lSbvJz Laadi alla]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Juhend&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=D2_KJu4yrtk asub siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LetsDoIt===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Liisa Suurkaev(projektijuht)&lt;br /&gt;
*Melissa Eenmaa&lt;br /&gt;
*Tanel Vähk&lt;br /&gt;
*Taavi Kliss&lt;br /&gt;
*Aleks Luik&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale LendBook asub [https://wiki.itcollege.ee/index.php/Talk:LendBook retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_mc2#Protot.C3.BC.C3.BCbi_retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Valmis toode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meeskonna LetsDoIt valmis toode asub [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt#Protot.C3.BC.C3.BCp siin].&lt;br /&gt;
&lt;br /&gt;
===Meeskond: VVA===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vladislav Lahtarin&lt;br /&gt;
*Vladislav Kovaltšuk&lt;br /&gt;
*Aleksandr Babõkin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_VVA Meeskond:_VVA]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale Sporto asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Anal.C3.BC.C3.BCsi_retsensioon_meeskonnale_.22Sporto.22 siin]&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Protot.C3.BC.C3.BCbi_retsensioon_meeskonnale_.22mc2.22 siin]&lt;br /&gt;
&lt;br /&gt;
Lõpptoote retsensioon meeskonnale &amp;quot;Sporto&amp;quot; asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#L.C3.B5pptoote_retsensioon_meeskonnale_.22Sporto.22 siin]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://enos.itcollege.ee/~vkovalt/Csharp/Desktop.html Mäng] ja [http://enos.itcollege.ee/~vkovalt/LaeAllaProto/ lähtekood]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://enos.itcollege.ee/~vkovalt/Valmis/WEB/Desktop.html Mäng] ja [http://enos.itcollege.ee/~vkovalt/Valmis/Projekt/ lähtekood]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: IncMan===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sergei Fatejev&lt;br /&gt;
*Nele Sergejeva&lt;br /&gt;
*Marko Koiduste&lt;br /&gt;
*Kaspar Tilk&lt;br /&gt;
*Jaanus Türnpuu&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Incman IncMan]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LetsDoIt&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LetsDoIt siin]&lt;br /&gt;
*Prototüübi retsensioon meeskonnale &#039;&#039;&#039;GlobalLite&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:GlobalLite siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Lebokeiss OÜ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Joonas Jõeleht - Projektijuht&lt;br /&gt;
*Iris Tambaum&lt;br /&gt;
*Timo Lanno&lt;br /&gt;
*Karell Veskimeister&lt;br /&gt;
*Kerli Edasi &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Lebokeiss_OÜ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo | Retsensioon meeskond Travo analüüsile]]&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo#Retsensioon_meeskond_Travo_projekti_protot.C3.BC.C3.BCbile | Retsensioon meeskond Travo prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MSI===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Ivask&lt;br /&gt;
*Martin Saar&lt;br /&gt;
*Indrek Tamm&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MSI]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LendBook===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Egle Arge&lt;br /&gt;
*Liina Kolk&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[LendBook]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:PenguinHorde | Retsensioon meeskonna PenguinHorde analüüsile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: BIT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Merilyn Renser&lt;br /&gt;
*Marko Hartikainen&lt;br /&gt;
*Ants Kristjan Rooma&lt;br /&gt;
*Konstantin Burdakov&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[BIT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_VVA#Anal.C3.BC.C3.BCsi_retsensioon VVA analüüsi retsensioon]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_VVA#Proto_retsensioon VVA proto retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: PenguinHorde===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Laura Leon&lt;br /&gt;
*Marko Saluste&lt;br /&gt;
*Terje Sõelsepp&lt;br /&gt;
*Mari-Liis Oldja&lt;br /&gt;
Meeskonna koduleht: [[PenguinHorde]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
Retsensioon [https://wiki.itcollege.ee/index.php/Talk:BIT meeskond BIT] analüüsile.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: GlobalElite===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Kivikink&lt;br /&gt;
*Indrek Nurja&lt;br /&gt;
*Imre Teras&lt;br /&gt;
*Aapo Kersalu&lt;br /&gt;
*Erling Tammisto&lt;br /&gt;
Meeskonna koduleht: [[GlobalLite]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
[https://www.dropbox.com/s/i7i01x3450umarh/GlobalElite_proto.rar?dl=0 Lae alla (RAR fail)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon [https://wiki.itcollege.ee/index.php/Talk:RJ meeskond RJ] kohta.&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon [https://wiki.itcollege.ee/index.php/Talk:VVA meeskond VVA] kohta.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: KTM Development===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kristian Laupa&lt;br /&gt;
*Tauno Otti&lt;br /&gt;
*Mart Abel&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_KTM_Development KTM Development]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;mc2&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/User_talk:Klaupa siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Bob?===&lt;br /&gt;
Liige:&lt;br /&gt;
*Priit Aarne&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Bob Bob?]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan prototüübi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1B6XMjJFSULSFJMeFdEM0tsWUE Lõpptoode]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: RJ===&lt;br /&gt;
Liige:&lt;br /&gt;
*Richard Jalonen&lt;br /&gt;
Meeskonna koduleht: [[RJ]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Qlibrium===&lt;br /&gt;
Liige:&lt;br /&gt;
*Karl Frank&lt;br /&gt;
Meeskonna koduleht [[Qlibrium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_GlobalLite_*#Meeskonna_GlobalLite_anal.C3.BC.C3.BCsi_retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Kodune Raamat===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Osa&lt;br /&gt;
*Taavi Kivimaa&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Kodune_Raamat Kodune Raamat]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TaTa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Talis Tammearu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:TaTa]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Ktreikel===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kert Treikelder&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_ktreikel]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: OkVaatame===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Aleks Tatter&lt;br /&gt;
*Vaiko Vällik&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Ok_Vaatame]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:OkVaatame_retsensioon_Qlibriumile]&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:OkVaatame_retsensioon_KTMile]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmeerimine CSharp keeles (2015) (Päevaõpe)]]&lt;br /&gt;
&lt;br /&gt;
==Kaugõpe==&lt;br /&gt;
===Meeskond: Premium===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarmo Petrovits&lt;br /&gt;
*Karin Talumäe&lt;br /&gt;
*Jevgeni Gavrilov &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Premium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Spooky Scary Skeletons===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kärt Palm DK22 &lt;br /&gt;
*Karina Egipt DK22 (Projektijuht)&lt;br /&gt;
*Erika Ehmann D32 &lt;br /&gt;
*Silver Saks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Spooky Scary Skeletons]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Esimene Prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016) - Lõpptoode]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016) - Lõpptoode]&lt;br /&gt;
&lt;br /&gt;
Lõpptoote kohta lugeda kindlasti ka meie wikist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Premium Retsensioon meeskonna Premium projekti HomeLibrary analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic#Retsensioon_protot.C3.BC.C3.BCbile Retsensioon meeskonna Fontastic projekti Fontastic prototüübile]&lt;br /&gt;
&lt;br /&gt;
=== Meeskond: Nocturne No. 20 in C-sharp Minor ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*10142848 (Projektijuht)&lt;br /&gt;
*10090107&lt;br /&gt;
*10143193&lt;br /&gt;
*10143313&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse prototüübile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LIB===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sigrid Pachel DK22 (Projektijuht)&lt;br /&gt;
*Diana Nikolajeva DK22&lt;br /&gt;
*Kristjan Adrat DK41&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: LIB]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond_Mardo Analüüsi retsensioon Mardo meeskonnale]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Pohjavesi Retsensioon meeskonnale Põhjavesi]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Greek?Mark===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Karit Kilgi DK22 (Projektijuht)&lt;br /&gt;
*Sten Kaasik DK22&lt;br /&gt;
*Siim Veskilt DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: GreekQMark]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 prototüübile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Tarraxacum===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Silja Kralik DK21 (Projektijuht)&lt;br /&gt;
*Liina Laumets DK21 &lt;br /&gt;
*Ragne Auling DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Tarraxacum]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon meeskonnale Põhjavesi]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Fontastic===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Erik Hirmo DK22 (Projektijuht)&lt;br /&gt;
*Piret Reinumägi DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Fontastic]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Konsa Retsensioon meeskonna Konsa projekti Ostukorv analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TTT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Ave Karjus DK22 &lt;br /&gt;
*Joonatan Uusväli DK22 (Projektijuht)&lt;br /&gt;
*Kaidar Viikman DK21 (Wiki pidaja)&lt;br /&gt;
*Oliver Tiks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: TTT (Trellid Teevad Tugevaks) | TTT (Trellid Teevad Tugevaks)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_GreekQMark#section=1 | Retsensioon meeskonna Greek?Mark projekti analüüsile]]&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Premium#section=2 | Retsensioon meeskonna Premium projekti prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Codezilla===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Anna Linskaja DK21 (Projektijuht)&lt;br /&gt;
*Alisa Dudinova DK21 &lt;br /&gt;
*Sergei Hristoforov DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Codezilla]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Maker Retsensioon meeskonna Maker projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Konsa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
&lt;br /&gt;
*Marko Konsa DK13&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Ostukorv]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Johhaidii===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Yogesh Sharma&lt;br /&gt;
*Juhan Trink&lt;br /&gt;
*Marju Niinemaa&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Johhaidii]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_Makerile Retsensioon meeskonna Maker analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sildur===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Andreas Papp (Projektijuht)&lt;br /&gt;
*Germo Väli&lt;br /&gt;
*Andres Trei&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Sildur]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: JT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tõnis Luik (Projektijuht)&lt;br /&gt;
*Juri Nikitin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[JT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Maker===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Öövel (Projektijuht)&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Maker]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Codezilla Retsensioon meeskonna Codezilla analüüsile]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Põhjavesi===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Indrek Pruul (Projektijuht)&lt;br /&gt;
*Jan Eerik&lt;br /&gt;
*Eeva Koplimets&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Pohjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Pohjavesi Retsensioon meeskonnale Spooky Scary Skeletons analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MMTL development===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Martin Mänd (Projektijuht)&lt;br /&gt;
*Taavi Lõhmus&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MMTL development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Mardo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Mardo Halapuu&lt;br /&gt;
Meeskonna koduleht:[https://wiki.itcollege.ee/index.php/Meeskond_Mardo Mardo]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100809</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100809"/>
		<updated>2016-01-21T00:04:15Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Arendusprotsess */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud lõpptoote kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100808</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100808"/>
		<updated>2016-01-21T00:04:02Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Valmis Rakendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud valmis rakenduse kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Lõpptoode ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100806</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100806"/>
		<updated>2016-01-21T00:03:18Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Arendusprotsess */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;19-21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Lisatud valmis rakenduse kirjeldus ja ülevaade tehtud tööst.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Valmis Rakendus ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=100805</id>
		<title>Juhend: Kodutöö aines &quot;Programmeerimine CSharp keeles&quot; (2015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=100805"/>
		<updated>2016-01-21T00:02:25Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Meeskond: Spooky Scary Skeletons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
=Kodutöö aines &amp;quot;Programmeerimine C# keeles&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
==Eesmärk==&lt;br /&gt;
Saada praktiline arenduskogemus .NET keskkonnas ning arendada meeskonnatöö kogemust ja analüüsivõimet. Kasutada arendusprotsessis koodihoidlat.&lt;br /&gt;
&lt;br /&gt;
==Reeglid==&lt;br /&gt;
Ühte projektimeeskonda kuulub 3-5 tudengit(Soovituslik meeskonna suurus on 3-4). Ühel teemal võib teostada projekti üks või mitu meeskonda.Töö käiku kajastatakse https://wiki.itcollege.ee keskkonnas või soovi korral võib seda teha ka ajaveebis(blogis).&lt;br /&gt;
Ajaveebi pidamise eesmärke on kaks: nii on võimalik kirja panna kõik mõtted ja ideed (ning nendest jääb jälg ja dokumentatsioon) ning õppejõul on hiljem võimalik saada ülevaade iga projektimeeskonna liikme panusest. Ajaveebi loob ja ajaveebi haldab projektimeeskond vabalt valitud (avalikus) keskkonnas. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekti loomine ja arendamine &#039;&#039;&#039;&lt;br /&gt;
Projekt lisatakse versioonihaldusesse, kasutades selleks [Team Foundation Service&#039;it http://tfs.visualstudio.com/] ning õppejõule antakse ligipääs. Õppejõu live id: maitposka ät hotmail.com . Projekt peab olema alates algfaasist lisatud TFSi ning kogu tööprotsess toimub versioonihaldust kasutades&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööde esitamine&#039;&#039;&#039; (prototüüb ja lõpptoode)&lt;br /&gt;
Töö esitamisel pakitakse see kokku ning lisatakse wiki leheküljele link lähtekoodile. Kui töö lähtekoodi ei soovita mingil põhjusel avalikustata, tuleb õppejõuga selle jaoks sõlmida eraldi kokkulepe. Lähtekood on vajalik, et tööd oleks võimalik hinnata nii õppejõul kui kaastudengitel selle kohta retsensiooni kirjutada.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Team Foundation Service kasutamine&#039;&#039;&#039; (tänasel päeval &#039;&#039; Visual Studio online&#039;&#039;)&lt;br /&gt;
[http://www.visualstudio.com/get-started/sign-up-for-visual-studio-online Step-by-Step juhend]&lt;br /&gt;
&lt;br /&gt;
NB! Siia tuleb õppejõu poolt lihtne screencast ka, kuid ideeliselt ei tohiks selle kasutamine olla väga keeruline.&lt;br /&gt;
&lt;br /&gt;
==Tähtaegadest kinnipidamine==&lt;br /&gt;
Projekt jaguneb alamosadeks, millele on määratud tähtajad. Tähtaegade ületamisel võimalike punkte ei kaotata. Kui töö aga on esitatud tähtajaks, siis on võimalik selle eest teenida boonuspunkte (enamasti 0-10% võimalikust maksimumist boonust). Enne tähtaega esitatud töö ei tähenda automaatselt maksimumpunkte, kui see ei ole sooritatud korralikult.&lt;br /&gt;
&lt;br /&gt;
==Hindamine==&lt;br /&gt;
Teostatuks loetakse projekt juhul, kui lähteülesanne on realiseeritud, lahendus on töötav, kuid esineb suuremaid vigu ning piirsituatsioonidega ei ole arvestatud.&lt;br /&gt;
Maksimumtulemuse saavutamiseks peab projekt olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus. Tehnilisi ja vormistuslike puudujääke on võimalik korvata lisavõimaluste realiseerimisega.Üldjuhul tuleb loodud lahendust ka praktikumides või loengutes teistele tudengitele tutvustada (ca 10 min).&lt;br /&gt;
Nagu eelpool mainitud, koosneb projekt erinevatest osadest. Punktide arvu määramisel arvestatakse ka tähtajast kinni pidamist, mille toimimisloogika on kirjeldatud eespool.&lt;br /&gt;
&lt;br /&gt;
===Meeskonna kokkupanek ja idee===&lt;br /&gt;
&#039;&#039;&#039;25.10.2015&#039;&#039;&#039; (2p)&lt;br /&gt;
&lt;br /&gt;
Tekitatakse meeskonna wiki lehekülg. Meeskonnal peab olema nimi ning see koosneb  kolmest kuni viiest liikmest. Määratakse projektijuht. Juhul kui hakatakse blogi pidama kuskil mujal keskkonnas ilmub selle kohta link. Lühidalt peaks kirjeldama idee olemust nii, et selle üldine suund oleks arusaadav. Samuti peab olema märgitud tehnoloogia, milles hakatakse rakendust looma. Meeskond on loonud TFSi konto ning on saatnud õppejõule kutse.&lt;br /&gt;
&lt;br /&gt;
===Analüüs===&lt;br /&gt;
&#039;&#039;&#039;01.11.2015&#039;&#039;&#039; (6p)&lt;br /&gt;
Analüütilise osa eesmärgiks on arendada tudengite analüüsioskust, mida on vaja ka päris tarkvaraarenduse protsessi juures.&#039;&#039;&#039;NB! Miinimum sõnade arv 700&#039;&#039;&#039; Selle osa käigus peab valmima loodava rakenduse analüüs, mis sisaldab muu hulgas ka:&lt;br /&gt;
*Analüüs rakendusele. (Mida see endas sisaldab? Mis on selle eesmärk? Mida tavakasutaja sellega teha saaks? Milliste osade realiseerimine võib osutuda problemaatiliseks?) Kui on tööjaotus paigas, siis tuua ka see välja.&lt;br /&gt;
*Tuua välja nimekiri funktsionaalsusest, mida plaanitakse kindlasti teostada(&#039;&#039;Must have&#039;&#039;)&lt;br /&gt;
*Nimekiri funktsionaalsustest, mis võiks olla, aga mida ei pruugita ajapuuduse tõttu realiseerida.(&#039;&#039;Nice to have&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 8.11.2015 (3p)&lt;br /&gt;
&lt;br /&gt;
===Prototüüp===&lt;br /&gt;
&#039;&#039;&#039;13.12.2015 23:58&#039;&#039;&#039;(10p)&lt;br /&gt;
&lt;br /&gt;
Valmib projekti esmane realisatsioon. Laias laastus on peafunktsionaalsused realiseeritud(Nimekiri funktsionaalsusest, mida plaanitakse teostada).  Programmis võib esineda üksikuid, kuid mitte väga suuri vigu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 20.12.2015(5p)&lt;br /&gt;
&lt;br /&gt;
===Lõpptoode===&lt;br /&gt;
&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;(20p)&lt;br /&gt;
Selleks faasiks peab projekt maksimumpuntkide saavutamiseks olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 27.01.2016(5p)&lt;br /&gt;
&lt;br /&gt;
===Esitlus/Kaitsmine=== &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Toimub loengutes/praktikumides või kokkulepitud ajal enne eksamit&#039;&#039;&#039; &#039;&#039;(4p) &#039;&#039;&lt;br /&gt;
Esitlusel kaitstakse projekti. Tutvustatakse tehnoloogiat, mida kasutati rakenduse realiseerimiseks.  Lühidalt räägitakse tööjaotusest ning probleemidest, mis tekkisid projekti realiseerimisel. Näidatakse lähtekoodi ja demonstreeritakse oma rakendust teistele tudengitele, kes võivad selle kohta küsimusi küsida. Kestvus ~20min.&lt;br /&gt;
&lt;br /&gt;
====Kaitsmise ajad====&lt;br /&gt;
&lt;br /&gt;
Tere, iga aja taha kirjutada meeskonna nimi, kes tuleb oma tööd kaitsma. Aegu palun täita võimaluse korral järjest.&lt;br /&gt;
&lt;br /&gt;
Ideaalne esitlus, sisaldab endas ka powerpointi, kus on&lt;br /&gt;
*väljatoodud meeskonna nimi ja liikmed&lt;br /&gt;
*idee&lt;br /&gt;
*realiseerimine&lt;br /&gt;
*mis oli keerukas?&lt;br /&gt;
*mida uut õpiti?&lt;br /&gt;
*mõnede keerulisemate probleemide lahendamine&lt;br /&gt;
*meeskonnaliikmete panus&lt;br /&gt;
&lt;br /&gt;
Kaitsmise käigus vaadatakse üle ka kood.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Esmaspäev&#039;&#039;&#039; - 14.12.2015&lt;br /&gt;
*14:00 - [https://wiki.itcollege.ee/index.php?title=Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
*14:15 -&lt;br /&gt;
*14:30 - &lt;br /&gt;
*14:45 -&lt;br /&gt;
*15:00 - Incman&lt;br /&gt;
*15:15 - &lt;br /&gt;
&lt;br /&gt;
*16:00 - &lt;br /&gt;
*16:15 - [[Meeskond: Travo]]&lt;br /&gt;
*16:30 - GlobalElite&lt;br /&gt;
*16:45 - [https://wiki.itcollege.ee/index.php/BIT BIT]&lt;br /&gt;
*17:00 - &lt;br /&gt;
*17:15 - KTM Development&lt;br /&gt;
*17:30 - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neljapäev&#039;&#039;&#039; - 17.12.2015&lt;br /&gt;
*08:15 - VVA&lt;br /&gt;
*08:30 - mc2&lt;br /&gt;
*08:45 - &lt;br /&gt;
*09:00 - Sporto&lt;br /&gt;
*09:15 - MinuKV&lt;br /&gt;
*09:30 - &lt;br /&gt;
&lt;br /&gt;
*10:00 -Kodune raamat&lt;br /&gt;
*10:15 - &lt;br /&gt;
*10:30 - MSI&lt;br /&gt;
*10:45 -&lt;br /&gt;
*11:00 - Lebokeiss OÜ&lt;br /&gt;
*11:15 - OKVaatame&lt;br /&gt;
&lt;br /&gt;
=Teemad 2015 sügis=&lt;br /&gt;
Kodutööna tuleb luua:&lt;br /&gt;
&lt;br /&gt;
==Nõuded rakendusele==&lt;br /&gt;
Loodav rakendus peab:&lt;br /&gt;
* Peab kasutama andmebaasi (erikokkuleppel ka XML formaadis andmeallikat)&lt;br /&gt;
**Andmebaasis peab olema vähemalt 6 andmebaasi tabelit&lt;br /&gt;
* Peab võimaldama tegevuste kohta registri pidamist (logi)&lt;br /&gt;
**Rakenduses tehtavad tegevused salvestatakse&lt;br /&gt;
* Kasutama kasutajaliidesena ühte järgmistest: Windows Presentation Foundation, Windows Phone , Windows Store App või ASP.Net&lt;br /&gt;
* Kood on kommenteeritud ning rakendus on varustatud dokumentatsiooniga&lt;br /&gt;
* Maksimumpunktide jaoks kasutatakse vastavalt valitud tehnoloogiale soovitatud arendusmustreid&lt;br /&gt;
* Kood on kirjutatud C# programmeerimiskeeles&lt;br /&gt;
**Kuna aine nimi on &amp;quot;Programmeerimine C# keeles&amp;quot; ei tohi esitada rakendust, mis on loodud Javas, PHPs vms keeles&lt;br /&gt;
* Rakendus on jaotatud kihtidesse&lt;br /&gt;
&#039;&#039;&#039;Loodav rakendus peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
*Kood on kommenteeritud&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea äriidee&lt;br /&gt;
&lt;br /&gt;
==Kodune raamatukogu==&lt;br /&gt;
Kodudes on tihti erinevaid raamatuid (filme, muud nänni) ja sõbrad tahavad neid vahel laenutada.&lt;br /&gt;
Loo rakendus, mis&lt;br /&gt;
* Võimaldaks sisestada kodused raamatud&lt;br /&gt;
* Võimaldaks luua laenutajate profiile&lt;br /&gt;
* Raamatuid välja laenutada (tähtajaliselt)&lt;br /&gt;
* Laseks koostada erinevaid aruandeid (kodusolevad raamatud, väljalaenutatud raamatud, tähtaja ületanud laenutused  jne)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Kui laenutaja profiilis on e-mail, siis saada automaatselt e-kiri „kallis sõber see ja see, Sinu käes on minu raamat, kas tood tagasi ka?”&lt;br /&gt;
* Kuva hoiatused, kui laenutaja laenutuste ajalugu on vilets või kui mõni raamat on tagastamata.&lt;br /&gt;
* Lase lisada raamatutele pilt&lt;br /&gt;
* Loo lihtne veebiliides (et sõbrad saaksid veebist vaadata, mis raamatud kasutajal  kodus veel alles on)&lt;br /&gt;
Või&lt;br /&gt;
&lt;br /&gt;
==CRM==&lt;br /&gt;
Oma klientidest peab olema ülevaade.&lt;br /&gt;
Loo rakendus, mis võimaldab:&lt;br /&gt;
* Kliente ning nende kontaktisikuid sisestada, muuta ning kustutada&lt;br /&gt;
* Võimalda sisestada kliendikontakte&lt;br /&gt;
* Koostada hinnapakkumisi klientidele, kusjuures hinnapakkumine lisatakse süsteemi ka kui kliendikontakt ning saadetakse samast süsteemist kliendile.&lt;br /&gt;
* Kliendi andmete vaatamisel kuvatakse ka kliendikontaktid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Loo võimalus, kus kontaktisiku sünnipäeva saabumisel saadetakse automaatselt inimesele meil õnnesoovidega&lt;br /&gt;
* Õnnitlusmeilide template’sid võiks olla mitu&lt;br /&gt;
* Loo võimalus kliendi huvide (huvialade) kajastamiseks süsteemis&lt;br /&gt;
&lt;br /&gt;
==Mäng(Unit)==&lt;br /&gt;
Loodav mäng peab sisaldama:&lt;br /&gt;
* Erinevaid tasemeid&lt;br /&gt;
* Punktiarvestust&lt;br /&gt;
* XBox puldi tuge&lt;br /&gt;
* Klaviatuurilt juhtimise tuge&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loodav mäng peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea &#039;&#039;story&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Meeskonnad 2015=&lt;br /&gt;
==Päevaõpe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MinuKV===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Luik&lt;br /&gt;
*Ahto Elken&lt;br /&gt;
*Silver Ohlo&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MinuKV]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_mc2#Retsensioon_mc2_meeskonna_anal.C3.BC.C3.BCsist siin].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meeskonna MinuKV lõpptoode asub [http://enos.itcollege.ee/~sohlo/MinuKV.7z siin] ja juhend wiki meeskonna kodulehel.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Travo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarvo Reinpalu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Travo]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Lebokeiss_OÜ Retsensioon meeskonna Lebokeiss OÜ rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Lebokeiss_OÜ Retsensioon meeskonna Lebokeiss OÜ rakenduse prototüübile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Freshmen===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Haas - Projektijuht&lt;br /&gt;
*Piret Pomerants&lt;br /&gt;
*Semjon Greef &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Freshmen Freshmen]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Retsensioon Qlibrium analüüsi [https://wiki.itcollege.ee/index.php/Talk:Qlibrium kohta]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: mc2===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Betlem&lt;br /&gt;
*Johannes Tamm&lt;br /&gt;
*Martin Mägi&lt;br /&gt;
*Jana Pipar &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: mc2]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_MinuKV_kohta#Retsensioon_MinuKV_kohta Retsensioon MinuKV kohta]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_ruhmaVVAprototuubikohta Retsensioon rühma VVA prototüübi kohta]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meie prototüüp asub [https://wiki.itcollege.ee/index.php/Meeskond:_mc2#Protot.C3.BC.C3.BCp SIIN]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sporto===&lt;br /&gt;
Liikmed ja panus projekti:&lt;br /&gt;
*Kelli Lukas 100%&lt;br /&gt;
*Vladimir Rõkovanov 100%&lt;br /&gt;
*Alar Ameerikas 100%&lt;br /&gt;
*Mikk Raudsepp 100%&lt;br /&gt;
Meeskonna koduleht (&#039;&#039;&#039;Dokumentatsioon&#039;&#039;&#039;): [https://wiki.itcollege.ee/index.php/Sporto  Sporto]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti prototüübile]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://onedrive.live.com/redir?resid=B04DA53E21E8691B!30244&amp;amp;authkey=!AO2gXYl6yrrc1HM&amp;amp;ithint=file%2c7z Laadi alla]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://1drv.ms/1lSbvJz Laadi alla]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Juhend&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=D2_KJu4yrtk asub siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LetsDoIt===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Liisa Suurkaev(projektijuht)&lt;br /&gt;
*Melissa Eenmaa&lt;br /&gt;
*Tanel Vähk&lt;br /&gt;
*Taavi Kliss&lt;br /&gt;
*Aleks Luik&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale LendBook asub [https://wiki.itcollege.ee/index.php/Talk:LendBook retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_mc2#Protot.C3.BC.C3.BCbi_retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Valmis toode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meeskonna LetsDoIt valmis toode asub [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt#Protot.C3.BC.C3.BCp siin].&lt;br /&gt;
&lt;br /&gt;
===Meeskond: VVA===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vladislav Lahtarin&lt;br /&gt;
*Vladislav Kovaltšuk&lt;br /&gt;
*Aleksandr Babõkin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_VVA Meeskond:_VVA]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale Sporto asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Anal.C3.BC.C3.BCsi_retsensioon_meeskonnale_.22Sporto.22 siin]&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Protot.C3.BC.C3.BCbi_retsensioon_meeskonnale_.22mc2.22 siin]&lt;br /&gt;
&lt;br /&gt;
Lõpptoote retsensioon meeskonnale &amp;quot;Sporto&amp;quot; asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#L.C3.B5pptoote_retsensioon_meeskonnale_.22Sporto.22 siin]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://enos.itcollege.ee/~vkovalt/Csharp/Desktop.html Mäng] ja [http://enos.itcollege.ee/~vkovalt/LaeAllaProto/ lähtekood]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://enos.itcollege.ee/~vkovalt/Valmis/WEB/Desktop.html Mäng] ja [http://enos.itcollege.ee/~vkovalt/Valmis/Projekt/ lähtekood]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: IncMan===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sergei Fatejev&lt;br /&gt;
*Nele Sergejeva&lt;br /&gt;
*Marko Koiduste&lt;br /&gt;
*Kaspar Tilk&lt;br /&gt;
*Jaanus Türnpuu&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Incman IncMan]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LetsDoIt&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LetsDoIt siin]&lt;br /&gt;
*Prototüübi retsensioon meeskonnale &#039;&#039;&#039;GlobalLite&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:GlobalLite siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Lebokeiss OÜ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Joonas Jõeleht - Projektijuht&lt;br /&gt;
*Iris Tambaum&lt;br /&gt;
*Timo Lanno&lt;br /&gt;
*Karell Veskimeister&lt;br /&gt;
*Kerli Edasi &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Lebokeiss_OÜ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo | Retsensioon meeskond Travo analüüsile]]&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo#Retsensioon_meeskond_Travo_projekti_protot.C3.BC.C3.BCbile | Retsensioon meeskond Travo prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MSI===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Ivask&lt;br /&gt;
*Martin Saar&lt;br /&gt;
*Indrek Tamm&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MSI]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LendBook===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Egle Arge&lt;br /&gt;
*Liina Kolk&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[LendBook]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:PenguinHorde | Retsensioon meeskonna PenguinHorde analüüsile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: BIT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Merilyn Renser&lt;br /&gt;
*Marko Hartikainen&lt;br /&gt;
*Ants Kristjan Rooma&lt;br /&gt;
*Konstantin Burdakov&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[BIT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_VVA#Anal.C3.BC.C3.BCsi_retsensioon VVA analüüsi retsensioon]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_VVA#Proto_retsensioon VVA proto retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: PenguinHorde===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Laura Leon&lt;br /&gt;
*Marko Saluste&lt;br /&gt;
*Terje Sõelsepp&lt;br /&gt;
*Mari-Liis Oldja&lt;br /&gt;
Meeskonna koduleht: [[PenguinHorde]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
Retsensioon [https://wiki.itcollege.ee/index.php/Talk:BIT meeskond BIT] analüüsile.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: GlobalElite===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Kivikink&lt;br /&gt;
*Indrek Nurja&lt;br /&gt;
*Imre Teras&lt;br /&gt;
*Aapo Kersalu&lt;br /&gt;
*Erling Tammisto&lt;br /&gt;
Meeskonna koduleht: [[GlobalLite]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
[https://www.dropbox.com/s/i7i01x3450umarh/GlobalElite_proto.rar?dl=0 Lae alla (RAR fail)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon [https://wiki.itcollege.ee/index.php/Talk:RJ meeskond RJ] kohta.&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon [https://wiki.itcollege.ee/index.php/Talk:VVA meeskond VVA] kohta.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: KTM Development===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kristian Laupa&lt;br /&gt;
*Tauno Otti&lt;br /&gt;
*Mart Abel&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_KTM_Development KTM Development]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;mc2&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/User_talk:Klaupa siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Bob?===&lt;br /&gt;
Liige:&lt;br /&gt;
*Priit Aarne&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Bob Bob?]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan prototüübi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0B1B6XMjJFSULSFJMeFdEM0tsWUE Lõpptoode]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: RJ===&lt;br /&gt;
Liige:&lt;br /&gt;
*Richard Jalonen&lt;br /&gt;
Meeskonna koduleht: [[RJ]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Qlibrium===&lt;br /&gt;
Liige:&lt;br /&gt;
*Karl Frank&lt;br /&gt;
Meeskonna koduleht [[Qlibrium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_GlobalLite_*#Meeskonna_GlobalLite_anal.C3.BC.C3.BCsi_retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Kodune Raamat===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Osa&lt;br /&gt;
*Taavi Kivimaa&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Kodune_Raamat Kodune Raamat]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TaTa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Talis Tammearu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:TaTa]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Ktreikel===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kert Treikelder&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_ktreikel]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: OkVaatame===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Aleks Tatter&lt;br /&gt;
*Vaiko Vällik&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Ok_Vaatame]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:OkVaatame_retsensioon_Qlibriumile]&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:OkVaatame_retsensioon_KTMile]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmeerimine CSharp keeles (2015) (Päevaõpe)]]&lt;br /&gt;
&lt;br /&gt;
==Kaugõpe==&lt;br /&gt;
===Meeskond: Premium===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarmo Petrovits&lt;br /&gt;
*Karin Talumäe&lt;br /&gt;
*Jevgeni Gavrilov &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Premium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Spooky Scary Skeletons===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kärt Palm DK22 &lt;br /&gt;
*Karina Egipt DK22 (Projektijuht)&lt;br /&gt;
*Erika Ehmann D32 &lt;br /&gt;
*Silver Saks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Spooky Scary Skeletons]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Esimene Prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
Valmis rakenduse kohta lugeda kindlasti ka meie wikist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Premium Retsensioon meeskonna Premium projekti HomeLibrary analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic#Retsensioon_protot.C3.BC.C3.BCbile Retsensioon meeskonna Fontastic projekti Fontastic prototüübile]&lt;br /&gt;
&lt;br /&gt;
=== Meeskond: Nocturne No. 20 in C-sharp Minor ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*10142848 (Projektijuht)&lt;br /&gt;
*10090107&lt;br /&gt;
*10143193&lt;br /&gt;
*10143313&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse prototüübile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LIB===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sigrid Pachel DK22 (Projektijuht)&lt;br /&gt;
*Diana Nikolajeva DK22&lt;br /&gt;
*Kristjan Adrat DK41&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: LIB]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond_Mardo Analüüsi retsensioon Mardo meeskonnale]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Pohjavesi Retsensioon meeskonnale Põhjavesi]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Greek?Mark===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Karit Kilgi DK22 (Projektijuht)&lt;br /&gt;
*Sten Kaasik DK22&lt;br /&gt;
*Siim Veskilt DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: GreekQMark]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 prototüübile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Tarraxacum===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Silja Kralik DK21 (Projektijuht)&lt;br /&gt;
*Liina Laumets DK21 &lt;br /&gt;
*Ragne Auling DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Tarraxacum]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon meeskonnale Põhjavesi]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Fontastic===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Erik Hirmo DK22 (Projektijuht)&lt;br /&gt;
*Piret Reinumägi DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Fontastic]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Konsa Retsensioon meeskonna Konsa projekti Ostukorv analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TTT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Ave Karjus DK22 &lt;br /&gt;
*Joonatan Uusväli DK22 (Projektijuht)&lt;br /&gt;
*Kaidar Viikman DK21 (Wiki pidaja)&lt;br /&gt;
*Oliver Tiks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: TTT (Trellid Teevad Tugevaks) | TTT (Trellid Teevad Tugevaks)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_GreekQMark#section=1 | Retsensioon meeskonna Greek?Mark projekti analüüsile]]&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Premium#section=2 | Retsensioon meeskonna Premium projekti prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Codezilla===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Anna Linskaja DK21 (Projektijuht)&lt;br /&gt;
*Alisa Dudinova DK21 &lt;br /&gt;
*Sergei Hristoforov DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Codezilla]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Maker Retsensioon meeskonna Maker projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Konsa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
&lt;br /&gt;
*Marko Konsa DK13&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Ostukorv]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Johhaidii===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Yogesh Sharma&lt;br /&gt;
*Juhan Trink&lt;br /&gt;
*Marju Niinemaa&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Johhaidii]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_Makerile Retsensioon meeskonna Maker analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sildur===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Andreas Papp (Projektijuht)&lt;br /&gt;
*Germo Väli&lt;br /&gt;
*Andres Trei&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Sildur]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: JT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tõnis Luik (Projektijuht)&lt;br /&gt;
*Juri Nikitin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[JT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Maker===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Öövel (Projektijuht)&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Maker]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Codezilla Retsensioon meeskonna Codezilla analüüsile]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Põhjavesi===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Indrek Pruul (Projektijuht)&lt;br /&gt;
*Jan Eerik&lt;br /&gt;
*Eeva Koplimets&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Pohjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Pohjavesi Retsensioon meeskonnale Spooky Scary Skeletons analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MMTL development===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Martin Mänd (Projektijuht)&lt;br /&gt;
*Taavi Lõhmus&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MMTL development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Mardo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Mardo Halapuu&lt;br /&gt;
Meeskonna koduleht:[https://wiki.itcollege.ee/index.php/Meeskond_Mardo Mardo]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100804</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100804"/>
		<updated>2016-01-21T00:01:03Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;br /&gt;
&lt;br /&gt;
== Valmis Rakendus ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100803</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100803"/>
		<updated>2016-01-21T00:00:22Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Avaldatud failid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=00ce781b71759d6f66017ad40dc81901 Rakenduse Server (20.01.2016)]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=dd72ab32e4900f3970d484317c94a94c Rakenduse Klient (20.01.2016)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100802</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100802"/>
		<updated>2016-01-20T23:58:36Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Arendusprotsess */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
*&#039;&#039;&#039;21.01.2015&#039;&#039;&#039;    - Viimane arendussprint.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100741</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=100741"/>
		<updated>2016-01-19T23:06:50Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime ja parooli POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust (tasuta Azure ei luba...welcome to 2016, Microsoft).&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame X-Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99774</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99774"/>
		<updated>2015-12-29T21:33:03Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
Kahjuks ei toeta Dreamsparki kaudu Azure ei SSL sertifikaate, ega ka custom domeene, et oleks võimalik SSL proxy luua.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99773</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99773"/>
		<updated>2015-12-29T21:05:15Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Projekti kirjeldus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/ https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele. Sisse logida oma MITTE-ITK Microsoft kontoga. Kinnitada ITK maili kaudu oma õpilase staatus, ning seejärel sisse logida Azure portaali sama kontoga. Portaalist valida Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse, et leida), ning peale pisut ootamist ongi VM olemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99772</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99772"/>
		<updated>2015-12-29T20:53:50Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Algne plaan oli kasutada PostgreSQL andmebaasi, kuna see omab mitmeid eeliseid MySQL-ga võrreldes, kuid uurides hostinguvõimalusi selgus, et Microsoft pakub Dreamsparki kaudu tasuta WebAPP+MySQL hostingut õpilastele.&lt;br /&gt;
&lt;br /&gt;
Selle aktiveerimiseks minna [https://azure.microsoft.com/en-us/pricing/member-offers/dreamspark-students/] lehele, sisse logida oma MITTE-ITK Microsoft kontoga, kinnitada ITK maili kaudu oma õpilase staatuse, ning seejärel saab Azure portalist Virtual Machines -&amp;gt; WebAPP+MySQL (ClearDB otsingusse ja leiab) virtuaalmasina. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=99399</id>
		<title>Juhend: Kodutöö aines &quot;Programmeerimine CSharp keeles&quot; (2015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=99399"/>
		<updated>2015-12-19T23:44:26Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Meeskond: Spooky Scary Skeletons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
=Kodutöö aines &amp;quot;Programmeerimine C# keeles&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
==Eesmärk==&lt;br /&gt;
Saada praktiline arenduskogemus .NET keskkonnas ning arendada meeskonnatöö kogemust ja analüüsivõimet. Kasutada arendusprotsessis koodihoidlat.&lt;br /&gt;
&lt;br /&gt;
==Reeglid==&lt;br /&gt;
Ühte projektimeeskonda kuulub 3-5 tudengit(Soovituslik meeskonna suurus on 3-4). Ühel teemal võib teostada projekti üks või mitu meeskonda.Töö käiku kajastatakse https://wiki.itcollege.ee keskkonnas või soovi korral võib seda teha ka ajaveebis(blogis).&lt;br /&gt;
Ajaveebi pidamise eesmärke on kaks: nii on võimalik kirja panna kõik mõtted ja ideed (ning nendest jääb jälg ja dokumentatsioon) ning õppejõul on hiljem võimalik saada ülevaade iga projektimeeskonna liikme panusest. Ajaveebi loob ja ajaveebi haldab projektimeeskond vabalt valitud (avalikus) keskkonnas. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekti loomine ja arendamine &#039;&#039;&#039;&lt;br /&gt;
Projekt lisatakse versioonihaldusesse, kasutades selleks [Team Foundation Service&#039;it http://tfs.visualstudio.com/] ning õppejõule antakse ligipääs. Õppejõu live id: maitposka ät hotmail.com . Projekt peab olema alates algfaasist lisatud TFSi ning kogu tööprotsess toimub versioonihaldust kasutades&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööde esitamine&#039;&#039;&#039; (prototüüb ja lõpptoode)&lt;br /&gt;
Töö esitamisel pakitakse see kokku ning lisatakse wiki leheküljele link lähtekoodile. Kui töö lähtekoodi ei soovita mingil põhjusel avalikustata, tuleb õppejõuga selle jaoks sõlmida eraldi kokkulepe. Lähtekood on vajalik, et tööd oleks võimalik hinnata nii õppejõul kui kaastudengitel selle kohta retsensiooni kirjutada.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Team Foundation Service kasutamine&#039;&#039;&#039; (tänasel päeval &#039;&#039; Visual Studio online&#039;&#039;)&lt;br /&gt;
[http://www.visualstudio.com/get-started/sign-up-for-visual-studio-online Step-by-Step juhend]&lt;br /&gt;
&lt;br /&gt;
NB! Siia tuleb õppejõu poolt lihtne screencast ka, kuid ideeliselt ei tohiks selle kasutamine olla väga keeruline.&lt;br /&gt;
&lt;br /&gt;
==Tähtaegadest kinnipidamine==&lt;br /&gt;
Projekt jaguneb alamosadeks, millele on määratud tähtajad. Tähtaegade ületamisel võimalike punkte ei kaotata. Kui töö aga on esitatud tähtajaks, siis on võimalik selle eest teenida boonuspunkte (enamasti 0-10% võimalikust maksimumist boonust). Enne tähtaega esitatud töö ei tähenda automaatselt maksimumpunkte, kui see ei ole sooritatud korralikult.&lt;br /&gt;
&lt;br /&gt;
==Hindamine==&lt;br /&gt;
Teostatuks loetakse projekt juhul, kui lähteülesanne on realiseeritud, lahendus on töötav, kuid esineb suuremaid vigu ning piirsituatsioonidega ei ole arvestatud.&lt;br /&gt;
Maksimumtulemuse saavutamiseks peab projekt olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus. Tehnilisi ja vormistuslike puudujääke on võimalik korvata lisavõimaluste realiseerimisega.Üldjuhul tuleb loodud lahendust ka praktikumides või loengutes teistele tudengitele tutvustada (ca 10 min).&lt;br /&gt;
Nagu eelpool mainitud, koosneb projekt erinevatest osadest. Punktide arvu määramisel arvestatakse ka tähtajast kinni pidamist, mille toimimisloogika on kirjeldatud eespool.&lt;br /&gt;
&lt;br /&gt;
===Meeskonna kokkupanek ja idee===&lt;br /&gt;
&#039;&#039;&#039;25.10.2015&#039;&#039;&#039; (2p)&lt;br /&gt;
&lt;br /&gt;
Tekitatakse meeskonna wiki lehekülg. Meeskonnal peab olema nimi ning see koosneb  kolmest kuni viiest liikmest. Määratakse projektijuht. Juhul kui hakatakse blogi pidama kuskil mujal keskkonnas ilmub selle kohta link. Lühidalt peaks kirjeldama idee olemust nii, et selle üldine suund oleks arusaadav. Samuti peab olema märgitud tehnoloogia, milles hakatakse rakendust looma. Meeskond on loonud TFSi konto ning on saatnud õppejõule kutse.&lt;br /&gt;
&lt;br /&gt;
===Analüüs===&lt;br /&gt;
&#039;&#039;&#039;01.11.2015&#039;&#039;&#039; (6p)&lt;br /&gt;
Analüütilise osa eesmärgiks on arendada tudengite analüüsioskust, mida on vaja ka päris tarkvaraarenduse protsessi juures.&#039;&#039;&#039;NB! Miinimum sõnade arv 700&#039;&#039;&#039; Selle osa käigus peab valmima loodava rakenduse analüüs, mis sisaldab muu hulgas ka:&lt;br /&gt;
*Analüüs rakendusele. (Mida see endas sisaldab? Mis on selle eesmärk? Mida tavakasutaja sellega teha saaks? Milliste osade realiseerimine võib osutuda problemaatiliseks?) Kui on tööjaotus paigas, siis tuua ka see välja.&lt;br /&gt;
*Tuua välja nimekiri funktsionaalsusest, mida plaanitakse kindlasti teostada(&#039;&#039;Must have&#039;&#039;)&lt;br /&gt;
*Nimekiri funktsionaalsustest, mis võiks olla, aga mida ei pruugita ajapuuduse tõttu realiseerida.(&#039;&#039;Nice to have&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 8.11.2015 (3p)&lt;br /&gt;
&lt;br /&gt;
===Prototüüp===&lt;br /&gt;
&#039;&#039;&#039;13.12.2015 23:58&#039;&#039;&#039;(10p)&lt;br /&gt;
&lt;br /&gt;
Valmib projekti esmane realisatsioon. Laias laastus on peafunktsionaalsused realiseeritud(Nimekiri funktsionaalsusest, mida plaanitakse teostada).  Programmis võib esineda üksikuid, kuid mitte väga suuri vigu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 20.12.2015(5p)&lt;br /&gt;
&lt;br /&gt;
===Lõpptoode===&lt;br /&gt;
&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;(20p)&lt;br /&gt;
Selleks faasiks peab projekt maksimumpuntkide saavutamiseks olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 27.01.2016(5p)&lt;br /&gt;
&lt;br /&gt;
===Esitlus/Kaitsmine=== &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Toimub loengutes/praktikumides või kokkulepitud ajal enne eksamit&#039;&#039;&#039; &#039;&#039;(4p) &#039;&#039;&lt;br /&gt;
Esitlusel kaitstakse projekti. Tutvustatakse tehnoloogiat, mida kasutati rakenduse realiseerimiseks.  Lühidalt räägitakse tööjaotusest ning probleemidest, mis tekkisid projekti realiseerimisel. Näidatakse lähtekoodi ja demonstreeritakse oma rakendust teistele tudengitele, kes võivad selle kohta küsimusi küsida. Kestvus ~20min.&lt;br /&gt;
&lt;br /&gt;
====Kaitsmise ajad====&lt;br /&gt;
&lt;br /&gt;
Tere, iga aja taha kirjutada meeskonna nimi, kes tuleb oma tööd kaitsma. Aegu palun täita võimaluse korral järjest.&lt;br /&gt;
&lt;br /&gt;
Ideaalne esitlus, sisaldab endas ka powerpointi, kus on&lt;br /&gt;
*väljatoodud meeskonna nimi ja liikmed&lt;br /&gt;
*idee&lt;br /&gt;
*realiseerimine&lt;br /&gt;
*mis oli keerukas?&lt;br /&gt;
*mida uut õpiti?&lt;br /&gt;
*mõnede keerulisemate probleemide lahendamine&lt;br /&gt;
*meeskonnaliikmete panus&lt;br /&gt;
&lt;br /&gt;
Kaitsmise käigus vaadatakse üle ka kood.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Esmaspäev&#039;&#039;&#039; - 14.12.2015&lt;br /&gt;
*14:00 - [https://wiki.itcollege.ee/index.php?title=Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
*14:15 -&lt;br /&gt;
*14:30 - &lt;br /&gt;
*14:45 -&lt;br /&gt;
*15:00 - Incman&lt;br /&gt;
*15:15 - &lt;br /&gt;
&lt;br /&gt;
*16:00 - &lt;br /&gt;
*16:15 - [[Meeskond: Travo]]&lt;br /&gt;
*16:30 - GlobalElite&lt;br /&gt;
*16:45 - [https://wiki.itcollege.ee/index.php/BIT BIT]&lt;br /&gt;
*17:00 - &lt;br /&gt;
*17:15 - KTM Development&lt;br /&gt;
*17:30 - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neljapäev&#039;&#039;&#039; - 17.12.2015&lt;br /&gt;
*08:15 - VVA&lt;br /&gt;
*08:30 - mc2&lt;br /&gt;
*08:45 - &lt;br /&gt;
*09:00 - Sporto&lt;br /&gt;
*09:15 - MinuKV&lt;br /&gt;
*09:30 - &lt;br /&gt;
&lt;br /&gt;
*10:00 -Kodune raamat&lt;br /&gt;
*10:15 - &lt;br /&gt;
*10:30 - MSI&lt;br /&gt;
*10:45 -&lt;br /&gt;
*11:00 - Lebokeiss OÜ&lt;br /&gt;
*11:15 - OKVaatame&lt;br /&gt;
&lt;br /&gt;
=Teemad 2015 sügis=&lt;br /&gt;
Kodutööna tuleb luua:&lt;br /&gt;
&lt;br /&gt;
==Nõuded rakendusele==&lt;br /&gt;
Loodav rakendus peab:&lt;br /&gt;
* Peab kasutama andmebaasi (erikokkuleppel ka XML formaadis andmeallikat)&lt;br /&gt;
**Andmebaasis peab olema vähemalt 6 andmebaasi tabelit&lt;br /&gt;
* Peab võimaldama tegevuste kohta registri pidamist (logi)&lt;br /&gt;
**Rakenduses tehtavad tegevused salvestatakse&lt;br /&gt;
* Kasutama kasutajaliidesena ühte järgmistest: Windows Presentation Foundation, Windows Phone , Windows Store App või ASP.Net&lt;br /&gt;
* Kood on kommenteeritud ning rakendus on varustatud dokumentatsiooniga&lt;br /&gt;
* Maksimumpunktide jaoks kasutatakse vastavalt valitud tehnoloogiale soovitatud arendusmustreid&lt;br /&gt;
* Kood on kirjutatud C# programmeerimiskeeles&lt;br /&gt;
**Kuna aine nimi on &amp;quot;Programmeerimine C# keeles&amp;quot; ei tohi esitada rakendust, mis on loodud Javas, PHPs vms keeles&lt;br /&gt;
* Rakendus on jaotatud kihtidesse&lt;br /&gt;
&#039;&#039;&#039;Loodav rakendus peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
*Kood on kommenteeritud&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea äriidee&lt;br /&gt;
&lt;br /&gt;
==Kodune raamatukogu==&lt;br /&gt;
Kodudes on tihti erinevaid raamatuid (filme, muud nänni) ja sõbrad tahavad neid vahel laenutada.&lt;br /&gt;
Loo rakendus, mis&lt;br /&gt;
* Võimaldaks sisestada kodused raamatud&lt;br /&gt;
* Võimaldaks luua laenutajate profiile&lt;br /&gt;
* Raamatuid välja laenutada (tähtajaliselt)&lt;br /&gt;
* Laseks koostada erinevaid aruandeid (kodusolevad raamatud, väljalaenutatud raamatud, tähtaja ületanud laenutused  jne)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Kui laenutaja profiilis on e-mail, siis saada automaatselt e-kiri „kallis sõber see ja see, Sinu käes on minu raamat, kas tood tagasi ka?”&lt;br /&gt;
* Kuva hoiatused, kui laenutaja laenutuste ajalugu on vilets või kui mõni raamat on tagastamata.&lt;br /&gt;
* Lase lisada raamatutele pilt&lt;br /&gt;
* Loo lihtne veebiliides (et sõbrad saaksid veebist vaadata, mis raamatud kasutajal  kodus veel alles on)&lt;br /&gt;
Või&lt;br /&gt;
&lt;br /&gt;
==CRM==&lt;br /&gt;
Oma klientidest peab olema ülevaade.&lt;br /&gt;
Loo rakendus, mis võimaldab:&lt;br /&gt;
* Kliente ning nende kontaktisikuid sisestada, muuta ning kustutada&lt;br /&gt;
* Võimalda sisestada kliendikontakte&lt;br /&gt;
* Koostada hinnapakkumisi klientidele, kusjuures hinnapakkumine lisatakse süsteemi ka kui kliendikontakt ning saadetakse samast süsteemist kliendile.&lt;br /&gt;
* Kliendi andmete vaatamisel kuvatakse ka kliendikontaktid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Loo võimalus, kus kontaktisiku sünnipäeva saabumisel saadetakse automaatselt inimesele meil õnnesoovidega&lt;br /&gt;
* Õnnitlusmeilide template’sid võiks olla mitu&lt;br /&gt;
* Loo võimalus kliendi huvide (huvialade) kajastamiseks süsteemis&lt;br /&gt;
&lt;br /&gt;
==Mäng(Unit)==&lt;br /&gt;
Loodav mäng peab sisaldama:&lt;br /&gt;
* Erinevaid tasemeid&lt;br /&gt;
* Punktiarvestust&lt;br /&gt;
* XBox puldi tuge&lt;br /&gt;
* Klaviatuurilt juhtimise tuge&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loodav mäng peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea &#039;&#039;story&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Meeskonnad 2015=&lt;br /&gt;
==Päevaõpe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MinuKV===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Luik&lt;br /&gt;
*Ahto Elken&lt;br /&gt;
*Silver Ohlo&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MinuKV]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Travo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarvo Reinpalu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Travo]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Freshmen===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Haas - Projektijuht&lt;br /&gt;
*Piret Pomerants&lt;br /&gt;
*Semjon Greef &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Freshmen Freshmen]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Retsensioon Qlibrium analüüsi [https://wiki.itcollege.ee/index.php/Talk:Qlibrium kohta]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: mc2===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Betlem&lt;br /&gt;
*Johannes Tamm&lt;br /&gt;
*Martin Mägi&lt;br /&gt;
*Jana Pipar &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: mc2]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_MinuKV_kohta#Retsensioon_MinuKV_kohta Retsensioon MinuKV kohta]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meie prototüüp asub [https://wiki.itcollege.ee/index.php/Meeskond:_mc2#Protot.C3.BC.C3.BCp SIIN]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sporto===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kelli Lukas&lt;br /&gt;
*Vladimir Rõkovanov&lt;br /&gt;
*Alar Ameerikas&lt;br /&gt;
*Mikk Raudsepp&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Sporto  Sporto]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://onedrive.live.com/redir?resid=B04DA53E21E8691B!30244&amp;amp;authkey=!AO2gXYl6yrrc1HM&amp;amp;ithint=file%2c7z Laadi alla]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://1drv.ms/1lSbvJz Laadi alla]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LetsDoIt===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Liisa Suurkaev(projektijuht)&lt;br /&gt;
*Melissa Eenmaa&lt;br /&gt;
*Tanel Vähk&lt;br /&gt;
*Taavi Kliss&lt;br /&gt;
*Aleks Luik&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale LendBook asub [https://wiki.itcollege.ee/index.php/Talk:LendBook retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
===Meeskond: VVA===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vladislav Lahtarin&lt;br /&gt;
*Vladislav Kovaltšuk&lt;br /&gt;
*Aleksandr Babõkin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_VVA Meeskond:_VVA]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale Sporto asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Anal.C3.BC.C3.BCsi_retsensioon_meeskonnale_.22Sporto.22 siin]&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Protot.C3.BC.C3.BCbi_retsensioon_meeskonnale_.22mc2.22 siin]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://enos.itcollege.ee/~vkovalt/Csharp/Desktop.html Mäng] ja [http://enos.itcollege.ee/~vkovalt/LaeAllaProto/ lähtekood]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: IncMan===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sergei Fatejev&lt;br /&gt;
*Nele Sergejeva&lt;br /&gt;
*Marko Koiduste&lt;br /&gt;
*Kaspar Tilk&lt;br /&gt;
*Jaanus Türnpuu&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Incman IncMan]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LetsDoIt&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LetsDoIt siin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Lebokeiss OÜ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Joonas Jõeleht - Projektijuht&lt;br /&gt;
*Iris Tambaum&lt;br /&gt;
*Timo Lanno&lt;br /&gt;
*Karell Veskimeister&lt;br /&gt;
*Kerli Edasi &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Lebokeiss_OÜ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo | Retsensioon meeskond Travo analüüsile]]&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo#Retsensioon_meeskond_Travo_projekti_protot.C3.BC.C3.BCbile | Retsensioon meeskond Travo prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MSI===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Ivask&lt;br /&gt;
*Martin Saar&lt;br /&gt;
*Indrek Tamm&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MSI]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LendBook===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Egle Arge&lt;br /&gt;
*Liina Kolk&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[LendBook]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:PenguinHorde | Retsensioon meeskonna PenguinHorde analüüsile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: BIT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Merilyn Renser&lt;br /&gt;
*Marko Hartikainen&lt;br /&gt;
*Ants Kristjan Rooma&lt;br /&gt;
*Konstantin Burdakov&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[BIT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[VVA analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: PenguinHorde===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Laura Leon&lt;br /&gt;
*Marko Saluste&lt;br /&gt;
*Terje Sõelsepp&lt;br /&gt;
*Mari-Liis Oldja&lt;br /&gt;
Meeskonna koduleht: [[PenguinHorde]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
Retsensioon [https://wiki.itcollege.ee/index.php/Talk:BIT meeskond BIT] analüüsile.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: GlobalElite===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Kivikink&lt;br /&gt;
*Indrek Nurja&lt;br /&gt;
*Imre Teras&lt;br /&gt;
*Aapo Kersalu&lt;br /&gt;
*Erling Tammisto&lt;br /&gt;
Meeskonna koduleht: [[GlobalLite]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
[https://www.dropbox.com/s/i7i01x3450umarh/GlobalElite_proto.rar?dl=0 Lae alla (RAR fail)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: KTM Development===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kristian Laupa&lt;br /&gt;
*Tauno Otti&lt;br /&gt;
*Mart Abel&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_KTM_Development KTM Development]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;mc2&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/User_talk:Klaupa siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Bob?===&lt;br /&gt;
Liige:&lt;br /&gt;
*Priit Aarne&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Bob Bob?]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: RJ===&lt;br /&gt;
Liige:&lt;br /&gt;
*Richard Jalonen&lt;br /&gt;
Meeskonna koduleht: [[RJ]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Qlibrium===&lt;br /&gt;
Liige:&lt;br /&gt;
*Karl Frank&lt;br /&gt;
Meeskonna koduleht [[Qlibrium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_GlobalLite_*#Meeskonna_GlobalLite_anal.C3.BC.C3.BCsi_retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Kodune Raamat===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Osa&lt;br /&gt;
*Taavi Kivimaa&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Kodune_Raamat Kodune Raamat]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TaTa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Talis Tammearu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:TaTa]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Ktreikel===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kert Treikelder&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_ktreikel]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmeerimine CSharp keeles (2015) (Päevaõpe)]]&lt;br /&gt;
&lt;br /&gt;
==Kaugõpe==&lt;br /&gt;
===Meeskond: Premium===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarmo Petrovits&lt;br /&gt;
*Karin Talumäe&lt;br /&gt;
*Jevgeni Gavrilov &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Premium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Spooky Scary Skeletons===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kärt Palm DK22 &lt;br /&gt;
*Karina Egipt DK22 (Projektijuht)&lt;br /&gt;
*Erika Ehmann D32 &lt;br /&gt;
*Silver Saks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Spooky Scary Skeletons]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Esimene Prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Premium Retsensioon meeskonna Premium projekti HomeLibrary analüüsile]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic#Retsensioon_protot.C3.BC.C3.BCbile Retsensioon meeskonna Fontastic projekti Fontastic prototüübile]&lt;br /&gt;
&lt;br /&gt;
=== Meeskond: Nocturne No. 20 in C-sharp Minor ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*10142848 (Projektijuht)&lt;br /&gt;
*10090107&lt;br /&gt;
*10143193&lt;br /&gt;
*10143313&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LIB===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sigrid Pachel DK22 (Projektijuht)&lt;br /&gt;
*Diana Nikolajeva DK22&lt;br /&gt;
*Kristjan Adrat DK41&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: LIB]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond_Mardo Analüüsi retsensioon Mardo meeskonnale]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Greek?Mark===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Karit Kilgi DK22 (Projektijuht)&lt;br /&gt;
*Sten Kaasik DK22&lt;br /&gt;
*Siim Veskilt DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: GreekQMark]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Tarraxacum===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Silja Kralik DK21 (Projektijuht)&lt;br /&gt;
*Liina Laumets DK21 &lt;br /&gt;
*Ragne Auling DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Tarraxacum]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon meeskonnale Põhjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Fontastic===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Erik Hirmo DK22 (Projektijuht)&lt;br /&gt;
*Piret Reinumägi DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Fontastic]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Konsa Retsensioon meeskonna Konsa projekti Ostukorv analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TTT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Ave Karjus DK22 &lt;br /&gt;
*Joonatan Uusväli DK22 (Projektijuht)&lt;br /&gt;
*Kaidar Viikman DK21 (Wiki pidaja)&lt;br /&gt;
*Oliver Tiks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: TTT (Trellid Teevad Tugevaks) | TTT (Trellid Teevad Tugevaks)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_GreekQMark#section=1 | Retsensioon meeskonna Greek?Mark projekti analüüsile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Codezilla===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Anna Linskaja DK21 (Projektijuht)&lt;br /&gt;
*Alisa Dudinova DK21 &lt;br /&gt;
*Sergei Hristoforov DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Codezilla]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Maker Retsensioon meeskonna Maker projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Konsa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
&lt;br /&gt;
*Marko Konsa DK13&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Ostukorv]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Johhaidii===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Yogesh Sharma&lt;br /&gt;
*Juhan Trink&lt;br /&gt;
*Marju Niinemaa&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Johhaidii]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_Makerile Retsensioon meeskonna Maker analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sildur===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Andreas Papp (Projektijuht)&lt;br /&gt;
*Germo Väli&lt;br /&gt;
*Andres Trei&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Sildur]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: JT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tõnis Luik (Projektijuht)&lt;br /&gt;
*Juri Nikitin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[JT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Maker===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Öövel (Projektijuht)&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Maker]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Codezilla Retsensioon meeskonna Codezilla analüüsile]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Põhjavesi===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Indrek Pruul (Projektijuht)&lt;br /&gt;
*Jan Eerik&lt;br /&gt;
*Eeva Koplimets&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Pohjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Pohjavesi Retsensioon meeskonnale Spooky Scary Skeletons analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MMTL development===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Martin Mänd (Projektijuht)&lt;br /&gt;
*Taavi Lõhmus&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MMTL development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Mardo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Mardo Halapuu&lt;br /&gt;
Meeskonna koduleht:[https://wiki.itcollege.ee/index.php/Meeskond_Mardo Mardo]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=99398</id>
		<title>Juhend: Kodutöö aines &quot;Programmeerimine CSharp keeles&quot; (2015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=99398"/>
		<updated>2015-12-19T23:44:18Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Meeskond: Spooky Scary Skeletons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
=Kodutöö aines &amp;quot;Programmeerimine C# keeles&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
==Eesmärk==&lt;br /&gt;
Saada praktiline arenduskogemus .NET keskkonnas ning arendada meeskonnatöö kogemust ja analüüsivõimet. Kasutada arendusprotsessis koodihoidlat.&lt;br /&gt;
&lt;br /&gt;
==Reeglid==&lt;br /&gt;
Ühte projektimeeskonda kuulub 3-5 tudengit(Soovituslik meeskonna suurus on 3-4). Ühel teemal võib teostada projekti üks või mitu meeskonda.Töö käiku kajastatakse https://wiki.itcollege.ee keskkonnas või soovi korral võib seda teha ka ajaveebis(blogis).&lt;br /&gt;
Ajaveebi pidamise eesmärke on kaks: nii on võimalik kirja panna kõik mõtted ja ideed (ning nendest jääb jälg ja dokumentatsioon) ning õppejõul on hiljem võimalik saada ülevaade iga projektimeeskonna liikme panusest. Ajaveebi loob ja ajaveebi haldab projektimeeskond vabalt valitud (avalikus) keskkonnas. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekti loomine ja arendamine &#039;&#039;&#039;&lt;br /&gt;
Projekt lisatakse versioonihaldusesse, kasutades selleks [Team Foundation Service&#039;it http://tfs.visualstudio.com/] ning õppejõule antakse ligipääs. Õppejõu live id: maitposka ät hotmail.com . Projekt peab olema alates algfaasist lisatud TFSi ning kogu tööprotsess toimub versioonihaldust kasutades&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööde esitamine&#039;&#039;&#039; (prototüüb ja lõpptoode)&lt;br /&gt;
Töö esitamisel pakitakse see kokku ning lisatakse wiki leheküljele link lähtekoodile. Kui töö lähtekoodi ei soovita mingil põhjusel avalikustata, tuleb õppejõuga selle jaoks sõlmida eraldi kokkulepe. Lähtekood on vajalik, et tööd oleks võimalik hinnata nii õppejõul kui kaastudengitel selle kohta retsensiooni kirjutada.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Team Foundation Service kasutamine&#039;&#039;&#039; (tänasel päeval &#039;&#039; Visual Studio online&#039;&#039;)&lt;br /&gt;
[http://www.visualstudio.com/get-started/sign-up-for-visual-studio-online Step-by-Step juhend]&lt;br /&gt;
&lt;br /&gt;
NB! Siia tuleb õppejõu poolt lihtne screencast ka, kuid ideeliselt ei tohiks selle kasutamine olla väga keeruline.&lt;br /&gt;
&lt;br /&gt;
==Tähtaegadest kinnipidamine==&lt;br /&gt;
Projekt jaguneb alamosadeks, millele on määratud tähtajad. Tähtaegade ületamisel võimalike punkte ei kaotata. Kui töö aga on esitatud tähtajaks, siis on võimalik selle eest teenida boonuspunkte (enamasti 0-10% võimalikust maksimumist boonust). Enne tähtaega esitatud töö ei tähenda automaatselt maksimumpunkte, kui see ei ole sooritatud korralikult.&lt;br /&gt;
&lt;br /&gt;
==Hindamine==&lt;br /&gt;
Teostatuks loetakse projekt juhul, kui lähteülesanne on realiseeritud, lahendus on töötav, kuid esineb suuremaid vigu ning piirsituatsioonidega ei ole arvestatud.&lt;br /&gt;
Maksimumtulemuse saavutamiseks peab projekt olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus. Tehnilisi ja vormistuslike puudujääke on võimalik korvata lisavõimaluste realiseerimisega.Üldjuhul tuleb loodud lahendust ka praktikumides või loengutes teistele tudengitele tutvustada (ca 10 min).&lt;br /&gt;
Nagu eelpool mainitud, koosneb projekt erinevatest osadest. Punktide arvu määramisel arvestatakse ka tähtajast kinni pidamist, mille toimimisloogika on kirjeldatud eespool.&lt;br /&gt;
&lt;br /&gt;
===Meeskonna kokkupanek ja idee===&lt;br /&gt;
&#039;&#039;&#039;25.10.2015&#039;&#039;&#039; (2p)&lt;br /&gt;
&lt;br /&gt;
Tekitatakse meeskonna wiki lehekülg. Meeskonnal peab olema nimi ning see koosneb  kolmest kuni viiest liikmest. Määratakse projektijuht. Juhul kui hakatakse blogi pidama kuskil mujal keskkonnas ilmub selle kohta link. Lühidalt peaks kirjeldama idee olemust nii, et selle üldine suund oleks arusaadav. Samuti peab olema märgitud tehnoloogia, milles hakatakse rakendust looma. Meeskond on loonud TFSi konto ning on saatnud õppejõule kutse.&lt;br /&gt;
&lt;br /&gt;
===Analüüs===&lt;br /&gt;
&#039;&#039;&#039;01.11.2015&#039;&#039;&#039; (6p)&lt;br /&gt;
Analüütilise osa eesmärgiks on arendada tudengite analüüsioskust, mida on vaja ka päris tarkvaraarenduse protsessi juures.&#039;&#039;&#039;NB! Miinimum sõnade arv 700&#039;&#039;&#039; Selle osa käigus peab valmima loodava rakenduse analüüs, mis sisaldab muu hulgas ka:&lt;br /&gt;
*Analüüs rakendusele. (Mida see endas sisaldab? Mis on selle eesmärk? Mida tavakasutaja sellega teha saaks? Milliste osade realiseerimine võib osutuda problemaatiliseks?) Kui on tööjaotus paigas, siis tuua ka see välja.&lt;br /&gt;
*Tuua välja nimekiri funktsionaalsusest, mida plaanitakse kindlasti teostada(&#039;&#039;Must have&#039;&#039;)&lt;br /&gt;
*Nimekiri funktsionaalsustest, mis võiks olla, aga mida ei pruugita ajapuuduse tõttu realiseerida.(&#039;&#039;Nice to have&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 8.11.2015 (3p)&lt;br /&gt;
&lt;br /&gt;
===Prototüüp===&lt;br /&gt;
&#039;&#039;&#039;13.12.2015 23:58&#039;&#039;&#039;(10p)&lt;br /&gt;
&lt;br /&gt;
Valmib projekti esmane realisatsioon. Laias laastus on peafunktsionaalsused realiseeritud(Nimekiri funktsionaalsusest, mida plaanitakse teostada).  Programmis võib esineda üksikuid, kuid mitte väga suuri vigu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 20.12.2015(5p)&lt;br /&gt;
&lt;br /&gt;
===Lõpptoode===&lt;br /&gt;
&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;(20p)&lt;br /&gt;
Selleks faasiks peab projekt maksimumpuntkide saavutamiseks olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 27.01.2016(5p)&lt;br /&gt;
&lt;br /&gt;
===Esitlus/Kaitsmine=== &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Toimub loengutes/praktikumides või kokkulepitud ajal enne eksamit&#039;&#039;&#039; &#039;&#039;(4p) &#039;&#039;&lt;br /&gt;
Esitlusel kaitstakse projekti. Tutvustatakse tehnoloogiat, mida kasutati rakenduse realiseerimiseks.  Lühidalt räägitakse tööjaotusest ning probleemidest, mis tekkisid projekti realiseerimisel. Näidatakse lähtekoodi ja demonstreeritakse oma rakendust teistele tudengitele, kes võivad selle kohta küsimusi küsida. Kestvus ~20min.&lt;br /&gt;
&lt;br /&gt;
====Kaitsmise ajad====&lt;br /&gt;
&lt;br /&gt;
Tere, iga aja taha kirjutada meeskonna nimi, kes tuleb oma tööd kaitsma. Aegu palun täita võimaluse korral järjest.&lt;br /&gt;
&lt;br /&gt;
Ideaalne esitlus, sisaldab endas ka powerpointi, kus on&lt;br /&gt;
*väljatoodud meeskonna nimi ja liikmed&lt;br /&gt;
*idee&lt;br /&gt;
*realiseerimine&lt;br /&gt;
*mis oli keerukas?&lt;br /&gt;
*mida uut õpiti?&lt;br /&gt;
*mõnede keerulisemate probleemide lahendamine&lt;br /&gt;
*meeskonnaliikmete panus&lt;br /&gt;
&lt;br /&gt;
Kaitsmise käigus vaadatakse üle ka kood.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Esmaspäev&#039;&#039;&#039; - 14.12.2015&lt;br /&gt;
*14:00 - [https://wiki.itcollege.ee/index.php?title=Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
*14:15 -&lt;br /&gt;
*14:30 - &lt;br /&gt;
*14:45 -&lt;br /&gt;
*15:00 - Incman&lt;br /&gt;
*15:15 - &lt;br /&gt;
&lt;br /&gt;
*16:00 - &lt;br /&gt;
*16:15 - [[Meeskond: Travo]]&lt;br /&gt;
*16:30 - GlobalElite&lt;br /&gt;
*16:45 - [https://wiki.itcollege.ee/index.php/BIT BIT]&lt;br /&gt;
*17:00 - &lt;br /&gt;
*17:15 - KTM Development&lt;br /&gt;
*17:30 - &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neljapäev&#039;&#039;&#039; - 17.12.2015&lt;br /&gt;
*08:15 - VVA&lt;br /&gt;
*08:30 - mc2&lt;br /&gt;
*08:45 - &lt;br /&gt;
*09:00 - Sporto&lt;br /&gt;
*09:15 - MinuKV&lt;br /&gt;
*09:30 - &lt;br /&gt;
&lt;br /&gt;
*10:00 -Kodune raamat&lt;br /&gt;
*10:15 - &lt;br /&gt;
*10:30 - MSI&lt;br /&gt;
*10:45 -&lt;br /&gt;
*11:00 - Lebokeiss OÜ&lt;br /&gt;
*11:15 - OKVaatame&lt;br /&gt;
&lt;br /&gt;
=Teemad 2015 sügis=&lt;br /&gt;
Kodutööna tuleb luua:&lt;br /&gt;
&lt;br /&gt;
==Nõuded rakendusele==&lt;br /&gt;
Loodav rakendus peab:&lt;br /&gt;
* Peab kasutama andmebaasi (erikokkuleppel ka XML formaadis andmeallikat)&lt;br /&gt;
**Andmebaasis peab olema vähemalt 6 andmebaasi tabelit&lt;br /&gt;
* Peab võimaldama tegevuste kohta registri pidamist (logi)&lt;br /&gt;
**Rakenduses tehtavad tegevused salvestatakse&lt;br /&gt;
* Kasutama kasutajaliidesena ühte järgmistest: Windows Presentation Foundation, Windows Phone , Windows Store App või ASP.Net&lt;br /&gt;
* Kood on kommenteeritud ning rakendus on varustatud dokumentatsiooniga&lt;br /&gt;
* Maksimumpunktide jaoks kasutatakse vastavalt valitud tehnoloogiale soovitatud arendusmustreid&lt;br /&gt;
* Kood on kirjutatud C# programmeerimiskeeles&lt;br /&gt;
**Kuna aine nimi on &amp;quot;Programmeerimine C# keeles&amp;quot; ei tohi esitada rakendust, mis on loodud Javas, PHPs vms keeles&lt;br /&gt;
* Rakendus on jaotatud kihtidesse&lt;br /&gt;
&#039;&#039;&#039;Loodav rakendus peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
*Kood on kommenteeritud&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea äriidee&lt;br /&gt;
&lt;br /&gt;
==Kodune raamatukogu==&lt;br /&gt;
Kodudes on tihti erinevaid raamatuid (filme, muud nänni) ja sõbrad tahavad neid vahel laenutada.&lt;br /&gt;
Loo rakendus, mis&lt;br /&gt;
* Võimaldaks sisestada kodused raamatud&lt;br /&gt;
* Võimaldaks luua laenutajate profiile&lt;br /&gt;
* Raamatuid välja laenutada (tähtajaliselt)&lt;br /&gt;
* Laseks koostada erinevaid aruandeid (kodusolevad raamatud, väljalaenutatud raamatud, tähtaja ületanud laenutused  jne)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Kui laenutaja profiilis on e-mail, siis saada automaatselt e-kiri „kallis sõber see ja see, Sinu käes on minu raamat, kas tood tagasi ka?”&lt;br /&gt;
* Kuva hoiatused, kui laenutaja laenutuste ajalugu on vilets või kui mõni raamat on tagastamata.&lt;br /&gt;
* Lase lisada raamatutele pilt&lt;br /&gt;
* Loo lihtne veebiliides (et sõbrad saaksid veebist vaadata, mis raamatud kasutajal  kodus veel alles on)&lt;br /&gt;
Või&lt;br /&gt;
&lt;br /&gt;
==CRM==&lt;br /&gt;
Oma klientidest peab olema ülevaade.&lt;br /&gt;
Loo rakendus, mis võimaldab:&lt;br /&gt;
* Kliente ning nende kontaktisikuid sisestada, muuta ning kustutada&lt;br /&gt;
* Võimalda sisestada kliendikontakte&lt;br /&gt;
* Koostada hinnapakkumisi klientidele, kusjuures hinnapakkumine lisatakse süsteemi ka kui kliendikontakt ning saadetakse samast süsteemist kliendile.&lt;br /&gt;
* Kliendi andmete vaatamisel kuvatakse ka kliendikontaktid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Loo võimalus, kus kontaktisiku sünnipäeva saabumisel saadetakse automaatselt inimesele meil õnnesoovidega&lt;br /&gt;
* Õnnitlusmeilide template’sid võiks olla mitu&lt;br /&gt;
* Loo võimalus kliendi huvide (huvialade) kajastamiseks süsteemis&lt;br /&gt;
&lt;br /&gt;
==Mäng(Unit)==&lt;br /&gt;
Loodav mäng peab sisaldama:&lt;br /&gt;
* Erinevaid tasemeid&lt;br /&gt;
* Punktiarvestust&lt;br /&gt;
* XBox puldi tuge&lt;br /&gt;
* Klaviatuurilt juhtimise tuge&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loodav mäng peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea &#039;&#039;story&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Meeskonnad 2015=&lt;br /&gt;
==Päevaõpe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MinuKV===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Luik&lt;br /&gt;
*Ahto Elken&lt;br /&gt;
*Silver Ohlo&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MinuKV]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Travo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarvo Reinpalu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Travo]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Freshmen===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Haas - Projektijuht&lt;br /&gt;
*Piret Pomerants&lt;br /&gt;
*Semjon Greef &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Freshmen Freshmen]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Retsensioon Qlibrium analüüsi [https://wiki.itcollege.ee/index.php/Talk:Qlibrium kohta]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: mc2===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Betlem&lt;br /&gt;
*Johannes Tamm&lt;br /&gt;
*Martin Mägi&lt;br /&gt;
*Jana Pipar &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: mc2]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_MinuKV_kohta#Retsensioon_MinuKV_kohta Retsensioon MinuKV kohta]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meie prototüüp asub [https://wiki.itcollege.ee/index.php/Meeskond:_mc2#Protot.C3.BC.C3.BCp SIIN]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sporto===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kelli Lukas&lt;br /&gt;
*Vladimir Rõkovanov&lt;br /&gt;
*Alar Ameerikas&lt;br /&gt;
*Mikk Raudsepp&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Sporto  Sporto]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://onedrive.live.com/redir?resid=B04DA53E21E8691B!30244&amp;amp;authkey=!AO2gXYl6yrrc1HM&amp;amp;ithint=file%2c7z Laadi alla]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lõpptoode&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://1drv.ms/1lSbvJz Laadi alla]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LetsDoIt===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Liisa Suurkaev(projektijuht)&lt;br /&gt;
*Melissa Eenmaa&lt;br /&gt;
*Tanel Vähk&lt;br /&gt;
*Taavi Kliss&lt;br /&gt;
*Aleks Luik&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale LendBook asub [https://wiki.itcollege.ee/index.php/Talk:LendBook retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
===Meeskond: VVA===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vladislav Lahtarin&lt;br /&gt;
*Vladislav Kovaltšuk&lt;br /&gt;
*Aleksandr Babõkin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_VVA Meeskond:_VVA]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale Sporto asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Anal.C3.BC.C3.BCsi_retsensioon_meeskonnale_.22Sporto.22 siin]&lt;br /&gt;
&lt;br /&gt;
Prototüübi retsensioon meeskonnale mc2 asub [https://wiki.itcollege.ee/index.php/Meeskond:_VVA#Protot.C3.BC.C3.BCbi_retsensioon_meeskonnale_.22mc2.22 siin]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://enos.itcollege.ee/~vkovalt/Csharp/Desktop.html Mäng] ja [http://enos.itcollege.ee/~vkovalt/LaeAllaProto/ lähtekood]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: IncMan===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sergei Fatejev&lt;br /&gt;
*Nele Sergejeva&lt;br /&gt;
*Marko Koiduste&lt;br /&gt;
*Kaspar Tilk&lt;br /&gt;
*Jaanus Türnpuu&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Incman IncMan]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LetsDoIt&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LetsDoIt siin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Lebokeiss OÜ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Joonas Jõeleht - Projektijuht&lt;br /&gt;
*Iris Tambaum&lt;br /&gt;
*Timo Lanno&lt;br /&gt;
*Karell Veskimeister&lt;br /&gt;
*Kerli Edasi &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Lebokeiss_OÜ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo | Retsensioon meeskond Travo analüüsile]]&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo#Retsensioon_meeskond_Travo_projekti_protot.C3.BC.C3.BCbile | Retsensioon meeskond Travo prototüübile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MSI===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Ivask&lt;br /&gt;
*Martin Saar&lt;br /&gt;
*Indrek Tamm&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MSI]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LendBook===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Egle Arge&lt;br /&gt;
*Liina Kolk&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[LendBook]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:PenguinHorde | Retsensioon meeskonna PenguinHorde analüüsile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: BIT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Merilyn Renser&lt;br /&gt;
*Marko Hartikainen&lt;br /&gt;
*Ants Kristjan Rooma&lt;br /&gt;
*Konstantin Burdakov&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[BIT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[VVA analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: PenguinHorde===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Laura Leon&lt;br /&gt;
*Marko Saluste&lt;br /&gt;
*Terje Sõelsepp&lt;br /&gt;
*Mari-Liis Oldja&lt;br /&gt;
Meeskonna koduleht: [[PenguinHorde]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
Retsensioon [https://wiki.itcollege.ee/index.php/Talk:BIT meeskond BIT] analüüsile.&lt;br /&gt;
&lt;br /&gt;
===Meeskond: GlobalElite===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Kivikink&lt;br /&gt;
*Indrek Nurja&lt;br /&gt;
*Imre Teras&lt;br /&gt;
*Aapo Kersalu&lt;br /&gt;
*Erling Tammisto&lt;br /&gt;
Meeskonna koduleht: [[GlobalLite]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
[https://www.dropbox.com/s/i7i01x3450umarh/GlobalElite_proto.rar?dl=0 Lae alla (RAR fail)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: KTM Development===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kristian Laupa&lt;br /&gt;
*Tauno Otti&lt;br /&gt;
*Mart Abel&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_KTM_Development KTM Development]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;mc2&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/User_talk:Klaupa siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Bob?===&lt;br /&gt;
Liige:&lt;br /&gt;
*Priit Aarne&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Bob Bob?]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: RJ===&lt;br /&gt;
Liige:&lt;br /&gt;
*Richard Jalonen&lt;br /&gt;
Meeskonna koduleht: [[RJ]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Qlibrium===&lt;br /&gt;
Liige:&lt;br /&gt;
*Karl Frank&lt;br /&gt;
Meeskonna koduleht [[Qlibrium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_GlobalLite_*#Meeskonna_GlobalLite_anal.C3.BC.C3.BCsi_retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Kodune Raamat===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Osa&lt;br /&gt;
*Taavi Kivimaa&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Kodune_Raamat Kodune Raamat]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TaTa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Talis Tammearu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:TaTa]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Ktreikel===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kert Treikelder&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_ktreikel]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmeerimine CSharp keeles (2015) (Päevaõpe)]]&lt;br /&gt;
&lt;br /&gt;
==Kaugõpe==&lt;br /&gt;
===Meeskond: Premium===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarmo Petrovits&lt;br /&gt;
*Karin Talumäe&lt;br /&gt;
*Jevgeni Gavrilov &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Premium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Spooky Scary Skeletons===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kärt Palm DK22 &lt;br /&gt;
*Karina Egipt DK22 (Projektijuht)&lt;br /&gt;
*Erika Ehmann D32 &lt;br /&gt;
*Silver Saks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Spooky Scary Skeletons]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Esimene Prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Premium Retsensioon meeskonna Premium projekti HomeLibrary analüüsile]&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic#Retsensioon_protot.C3.BC.C3.BCbile Retsensioon meeskonna Fontastic projekti Fontastic prototüübile]&lt;br /&gt;
&lt;br /&gt;
=== Meeskond: Nocturne No. 20 in C-sharp Minor ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*10142848 (Projektijuht)&lt;br /&gt;
*10090107&lt;br /&gt;
*10143193&lt;br /&gt;
*10143313&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LIB===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sigrid Pachel DK22 (Projektijuht)&lt;br /&gt;
*Diana Nikolajeva DK22&lt;br /&gt;
*Kristjan Adrat DK41&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: LIB]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond_Mardo Analüüsi retsensioon Mardo meeskonnale]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Greek?Mark===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Karit Kilgi DK22 (Projektijuht)&lt;br /&gt;
*Sten Kaasik DK22&lt;br /&gt;
*Siim Veskilt DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: GreekQMark]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Tarraxacum===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Silja Kralik DK21 (Projektijuht)&lt;br /&gt;
*Liina Laumets DK21 &lt;br /&gt;
*Ragne Auling DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Tarraxacum]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon meeskonnale Põhjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Fontastic===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Erik Hirmo DK22 (Projektijuht)&lt;br /&gt;
*Piret Reinumägi DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Fontastic]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Konsa Retsensioon meeskonna Konsa projekti Ostukorv analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TTT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Ave Karjus DK22 &lt;br /&gt;
*Joonatan Uusväli DK22 (Projektijuht)&lt;br /&gt;
*Kaidar Viikman DK21 (Wiki pidaja)&lt;br /&gt;
*Oliver Tiks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: TTT (Trellid Teevad Tugevaks) | TTT (Trellid Teevad Tugevaks)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_GreekQMark#section=1 | Retsensioon meeskonna Greek?Mark projekti analüüsile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Codezilla===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Anna Linskaja DK21 (Projektijuht)&lt;br /&gt;
*Alisa Dudinova DK21 &lt;br /&gt;
*Sergei Hristoforov DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Codezilla]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Maker Retsensioon meeskonna Maker projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Konsa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
&lt;br /&gt;
*Marko Konsa DK13&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Ostukorv]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Johhaidii===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Yogesh Sharma&lt;br /&gt;
*Juhan Trink&lt;br /&gt;
*Marju Niinemaa&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Johhaidii]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_Makerile Retsensioon meeskonna Maker analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sildur===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Andreas Papp (Projektijuht)&lt;br /&gt;
*Germo Väli&lt;br /&gt;
*Andres Trei&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Sildur]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: JT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tõnis Luik (Projektijuht)&lt;br /&gt;
*Juri Nikitin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[JT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Maker===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Öövel (Projektijuht)&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Maker]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Codezilla Retsensioon meeskonna Codezilla analüüsile]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Põhjavesi===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Indrek Pruul (Projektijuht)&lt;br /&gt;
*Jan Eerik&lt;br /&gt;
*Eeva Koplimets&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Pohjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Pohjavesi Retsensioon meeskonnale Spooky Scary Skeletons analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MMTL development===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Martin Mänd (Projektijuht)&lt;br /&gt;
*Taavi Lõhmus&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MMTL development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Mardo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Mardo Halapuu&lt;br /&gt;
Meeskonna koduleht:[https://wiki.itcollege.ee/index.php/Meeskond_Mardo Mardo]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99397</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99397"/>
		<updated>2015-12-19T23:43:10Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Arendusprotsess */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;20.12.2015&#039;&#039;&#039;    - Lisatud prototüübi retsensioon meeskonnale Fontastic&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Talk:Meeskond:_Fontastic&amp;diff=99396</id>
		<title>Talk:Meeskond: Fontastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Talk:Meeskond:_Fontastic&amp;diff=99396"/>
		<updated>2015-12-19T23:42:11Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Retsensioon prototüübile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Retsensioon analüüsile ==&lt;br /&gt;
&lt;br /&gt;
Käesolev retsensiooni on koostatud meeskonna Fontastic analüüsile fontidest ülevaate saamiseks ja nende haldamiseks loodavale töölaua rakendusele. Analüüsi retsenseerimisel on lähtutud juhendis [https://wiki.itcollege.ee/index.php/Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015) “Kodutöö aines “Programmeerimine CSharp keeles” (2015)”] projekti analüüsi kohta toodud nõuetest ning võrreldud analüüsi vastavust nendele.&lt;br /&gt;
 &lt;br /&gt;
Rakenduse eesmärk on analüüsis selgelt välja toodud. Leitud on aktuaalne probleem, seda on põhjalikult käsitletud erinevatest aspektidest ja esinemisvormidest lähtudes ning selle põhjal koostatud nägemus lahendusest. Siiski ei saa nõustuda väitega, et kuigi Adobe on graafikadisaini tarkvara tootmises peaaegu monopoolses seisus, oleks tema poolt pakutav Typekit justkui ainuke fontide halduse lahendus. Fontide halduse tarkvara käsitlev [https://en.wikipedia.org/wiki/Font_management_software Wikipedia lehekülg] pakub üle 30 alternatiivi, millega oleks meeskonnal ideede kogumiseks ja lihvimiseks kindlasti mõistlik tutvuda. Samuti on Google’il veebipõhine fontide halduse lahendus [https://www.google.com/fonts Google Fonts].&lt;br /&gt;
&lt;br /&gt;
Analüüsis on toodud loodava rakenduse funktsioonina põhiliselt erinevad viisid fontide kuvamiseks, otsimiseks ja valimiseks. Seoses funktsionaalsusega jääb arusaamatuks, mida täpsemalt mõeldakse “&#039;&#039;[---] Fonte kuvatakse kaartidel, mida on ühes reas näiteks 4 tükki [---]&#039;&#039;” all. Kas mõeldud on näiteks reas olevaid pilte või hoopis tabeli rida. Üldjoontes võib öelda, et analüüsi eesmärgis toodud probleemi pakutud funktsionaalsus tõenäoliselt lahendab ehk pakub süsteemis installeeritud fontidest parema ülevaate ja võimaluse neid organiseerida.&lt;br /&gt;
&lt;br /&gt;
Sellegipoolest võiks kõnealune rakendus tegeleda ka tegelikult fontide haldamisega ehk kindlasti peaks olema võimalik muuta konkreetseid fonte vastavalt vajadusele aktiivseks ja mitteaktiivseks, nt. liigutades neid operatsioonisüsteemi fontide kataloogi ja rakenduse hallatava fontide kataloogi vahel. Selline vajaduspõhine fontide lülitamine aitaks lahendada ka analüüsi eesmärgi all käsitletud n.n. 500 fondi ja pika valiku kerimise probleemi - aktiivsed oleks ainult konkreetse graafikaprojekti või dokumendi teostamiseks vajalikud fondid. Samuti oleksid fonte kasutavad rakendused kiiremad, kuna neil puuduks vajadus kõigi süsteemi fontide laadimiseks, milleks võib suure süsteemi fontide kataloogi puhul kuluda väga palju aega.&lt;br /&gt;
&lt;br /&gt;
Seoses võimalike takistustega rakenduse arendamisel on meeskond toonud välja ühilduvusprobleemi erinevate Windows’i versioonidega. IT-maailmas kahtlemata väga tavapärane olukord ja probleemi ilmnemisel on tõenäoliselt mõistlik keskenduda ainult paarile viimasele Windows’i versioonile.&lt;br /&gt;
&lt;br /&gt;
Lõpetuseks peatume ka formaalsetel nõuetel. Kodutöö juhendi järgi peaks andmebaasis olema vähemalt 6 andmebaasi tabelit. Meeskonna poolt koostatud analüüsi ja projekti logi põhjal võib järeldada, et plaanitakse kasutada andmebaasi, kuid kahjuks puudub otsene kirjeldus, kas üldse ja kui, siis kuidas, seal fontide nimekirja ning muid tegevustega seotud andmeid hoidma hakatakse. Ülevaatlikkuse huvides oleks võinud andmebaasi skeemi olemasolul lisada ka selle analüüsi juurde.&lt;br /&gt;
&lt;br /&gt;
Kodutöö juhendis on toodud ka nõue, et analüüsi minimaalne sõnade arv peab olema 700, kuid retsenseeritavas analüüsis on ainult 597 sõna. Siiski andis analüüs lahendatavast probleemist ja loodavast rakendusest konkreetse ülevaate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fontastic meeskonnale rakenduse arendamisel jõudu soovides&lt;br /&gt;
&lt;br /&gt;
[[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
== Retsensioon prototüübile ==&lt;br /&gt;
&lt;br /&gt;
Esiteks märkasin kohe, et andmebaas initsialiseeritakse automaatselt selle puudumisel. See on prototüüpi avaldades kahtlemata vajalik funktsionaalsus ja palju meeldivam oli prototüüpi hinnata.&lt;br /&gt;
Samas, märkasin sellega seoses ka kohe bugi: süsteemi installeeritud fontide nimekiri loetakse andmebaasi loomisel andmebaasi, kuid hiljem süsteemi fonte lisades seda nimekirja andmebaasis ei uuendata. Usun et kindlasti peaks rakendus ka fontide nimekirja vähemalt taaskäivitusel vajadusel uuendama.&lt;br /&gt;
&lt;br /&gt;
MVVM arendusmustrist ei ole kinni peetud, kogu kasutajaliidese kood asub MainWindow codebehindis. Kuna tegu on WPF rakendusega, siis MVVM on tugevalt soovitatav arendusmuster mida kasutada. &lt;br /&gt;
&lt;br /&gt;
Üldine mulje kasutaja seisukohalt rakendusest on hea, rakendus töötab piisavalt kiiresti ning kasutajaliides on arusaadav. Rakendus võiks meeles pidada muudetud Example text-i käivituste vahel. Samuti jääb pisut selgusetuks hetkel tab-ide mõte. Kui tabid on ainult tagide grupeerimiseks, siis võiks kindlasti olla ka võimalus luua tage mis ei ole otseselt ühegi tabiga või on seotud mitme tabiga. Näiteks tagid serif/sans-serif võiks olla nähtavad igas tabis.&lt;br /&gt;
&lt;br /&gt;
Aine seisukohalt tekitab muret rakenduse lihtsus. Juhul kui rakendusele mingit suuremat funktsionaalsust enam juurde ei ole planeeritud, siis usun et vähemalt MVVM mustri kasutamine oleks korralike punktide saamiseks vajalik.&lt;br /&gt;
&lt;br /&gt;
Samas, juba prototüübifaasis on peaaegu kogu planeeritud funktsionaalsus saavutatud, nii et hästi tehtud.&lt;br /&gt;
&lt;br /&gt;
Koostas: [[Meeskond: Spooky Scary Skeletons]]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Talk:Meeskond:_Fontastic&amp;diff=99395</id>
		<title>Talk:Meeskond: Fontastic</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Talk:Meeskond:_Fontastic&amp;diff=99395"/>
		<updated>2015-12-19T23:41:17Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Retsensioon analüüsile ==&lt;br /&gt;
&lt;br /&gt;
Käesolev retsensiooni on koostatud meeskonna Fontastic analüüsile fontidest ülevaate saamiseks ja nende haldamiseks loodavale töölaua rakendusele. Analüüsi retsenseerimisel on lähtutud juhendis [https://wiki.itcollege.ee/index.php/Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015) “Kodutöö aines “Programmeerimine CSharp keeles” (2015)”] projekti analüüsi kohta toodud nõuetest ning võrreldud analüüsi vastavust nendele.&lt;br /&gt;
 &lt;br /&gt;
Rakenduse eesmärk on analüüsis selgelt välja toodud. Leitud on aktuaalne probleem, seda on põhjalikult käsitletud erinevatest aspektidest ja esinemisvormidest lähtudes ning selle põhjal koostatud nägemus lahendusest. Siiski ei saa nõustuda väitega, et kuigi Adobe on graafikadisaini tarkvara tootmises peaaegu monopoolses seisus, oleks tema poolt pakutav Typekit justkui ainuke fontide halduse lahendus. Fontide halduse tarkvara käsitlev [https://en.wikipedia.org/wiki/Font_management_software Wikipedia lehekülg] pakub üle 30 alternatiivi, millega oleks meeskonnal ideede kogumiseks ja lihvimiseks kindlasti mõistlik tutvuda. Samuti on Google’il veebipõhine fontide halduse lahendus [https://www.google.com/fonts Google Fonts].&lt;br /&gt;
&lt;br /&gt;
Analüüsis on toodud loodava rakenduse funktsioonina põhiliselt erinevad viisid fontide kuvamiseks, otsimiseks ja valimiseks. Seoses funktsionaalsusega jääb arusaamatuks, mida täpsemalt mõeldakse “&#039;&#039;[---] Fonte kuvatakse kaartidel, mida on ühes reas näiteks 4 tükki [---]&#039;&#039;” all. Kas mõeldud on näiteks reas olevaid pilte või hoopis tabeli rida. Üldjoontes võib öelda, et analüüsi eesmärgis toodud probleemi pakutud funktsionaalsus tõenäoliselt lahendab ehk pakub süsteemis installeeritud fontidest parema ülevaate ja võimaluse neid organiseerida.&lt;br /&gt;
&lt;br /&gt;
Sellegipoolest võiks kõnealune rakendus tegeleda ka tegelikult fontide haldamisega ehk kindlasti peaks olema võimalik muuta konkreetseid fonte vastavalt vajadusele aktiivseks ja mitteaktiivseks, nt. liigutades neid operatsioonisüsteemi fontide kataloogi ja rakenduse hallatava fontide kataloogi vahel. Selline vajaduspõhine fontide lülitamine aitaks lahendada ka analüüsi eesmärgi all käsitletud n.n. 500 fondi ja pika valiku kerimise probleemi - aktiivsed oleks ainult konkreetse graafikaprojekti või dokumendi teostamiseks vajalikud fondid. Samuti oleksid fonte kasutavad rakendused kiiremad, kuna neil puuduks vajadus kõigi süsteemi fontide laadimiseks, milleks võib suure süsteemi fontide kataloogi puhul kuluda väga palju aega.&lt;br /&gt;
&lt;br /&gt;
Seoses võimalike takistustega rakenduse arendamisel on meeskond toonud välja ühilduvusprobleemi erinevate Windows’i versioonidega. IT-maailmas kahtlemata väga tavapärane olukord ja probleemi ilmnemisel on tõenäoliselt mõistlik keskenduda ainult paarile viimasele Windows’i versioonile.&lt;br /&gt;
&lt;br /&gt;
Lõpetuseks peatume ka formaalsetel nõuetel. Kodutöö juhendi järgi peaks andmebaasis olema vähemalt 6 andmebaasi tabelit. Meeskonna poolt koostatud analüüsi ja projekti logi põhjal võib järeldada, et plaanitakse kasutada andmebaasi, kuid kahjuks puudub otsene kirjeldus, kas üldse ja kui, siis kuidas, seal fontide nimekirja ning muid tegevustega seotud andmeid hoidma hakatakse. Ülevaatlikkuse huvides oleks võinud andmebaasi skeemi olemasolul lisada ka selle analüüsi juurde.&lt;br /&gt;
&lt;br /&gt;
Kodutöö juhendis on toodud ka nõue, et analüüsi minimaalne sõnade arv peab olema 700, kuid retsenseeritavas analüüsis on ainult 597 sõna. Siiski andis analüüs lahendatavast probleemist ja loodavast rakendusest konkreetse ülevaate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fontastic meeskonnale rakenduse arendamisel jõudu soovides&lt;br /&gt;
&lt;br /&gt;
[[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
== Retsensioon prototüübile ==&lt;br /&gt;
&lt;br /&gt;
Esiteks märkasin kohe, et andmebaas initsialiseeritakse automaatselt selle puudumisel. See on prototüüpi avaldades kahtlemata vajalik funktsionaalsus ja palju meeldivam oli prototüüpi hinnata.&lt;br /&gt;
Samas, märkasin sellega seoses ka kohe bugi: süsteemi installeeritud fontide nimekiri loetakse andmebaasi loomisel andmebaasi, kuid hiljem süsteemi fonte lisades seda nimekirja andmebaasis ei uuendata. Usun et kindlasti peaks rakendus ka fontide nimekirja vähemalt taaskäivitusel vajadusel uuendama.&lt;br /&gt;
&lt;br /&gt;
MVVM arendusmustrist ei ole kinni peetud, kogu kasutajaliidese kood asub MainWindow codebehindis. Kuna tegu on WPF rakendusega, siis MVVM on tugevalt soovitatav arendusmuster mida kasutada. &lt;br /&gt;
&lt;br /&gt;
Üldine mulje kasutaja seisukohalt rakendusest on hea, rakendus töötab piisavalt kiiresti ning kasutajaliides on arusaadav. Rakendus võiks meeles pidada muudetud Example text-i käivituste vahel. Samuti jääb pisut selgusetuks hetkel tab-ide mõte. Kui tabid on ainult tagide grupeerimiseks, siis võiks kindlasti olla ka võimalus luua tage mis ei ole otseselt ühegi tabiga või on seotud mitme tabiga. Näiteks tagid serif/sans-serif võiks olla nähtavad igas tabis.&lt;br /&gt;
&lt;br /&gt;
Aine seisukohalt tekitab muret rakenduse lihtsus. Juhul kui rakendusele mingit suuremat funktsionaalsust enam juurde ei ole planeeritud, siis usun et vähemalt MVVM mustri kasutamine oleks korralike punktide saamiseks vajalik.&lt;br /&gt;
&lt;br /&gt;
Samas, juba prototüübifaasis on peaaegu kogu planeeritud funktsionaalsus saavutatud, nii et hästi tehtud.&lt;br /&gt;
&lt;br /&gt;
[[Meeskond: Spooky Scary Skeletons]]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99043</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99043"/>
		<updated>2015-12-14T09:58:34Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik sqlite andmebaas on mõeldud kasutamiseks ainult serveri andmebaasi cachena. See tähendab, et kliendi ja serveri vahelise suhtlusega on paar keerulist probleemi tarvis lahendada:&lt;br /&gt;
* Server peab omama vaadet tsentraalsele andmebaasile iga kasutaja perspektiivist&lt;br /&gt;
* Klient peab oskama küsida serverilt ainult neid uuendusi mida tal cachetud ei ole&lt;br /&gt;
* Klient peab suutma kontrollida oma cache vastavust serveri andembaasile&lt;br /&gt;
* Kui klient saadab API päringu serverisse, peab kasutajamugavuse nimel koheselt kirjutama muudatused cache-i, ning hiljem asünkroonselt serverilt negatiivse vastuse korral peab olema võimalik tehtud transaktsioon tagasi võtta, et cache ja server sünkroonist välja ei läheks. &lt;br /&gt;
* Mida teha juhul kui klient ei saa üldse serveriga ühendust?&lt;br /&gt;
&lt;br /&gt;
Hetkel on meie strateegia võetud järgmine: andmebaaside vastavust kontrollitakse checksumi abil. Klient hoiab andmeid mälus, ning otse cache ei kirjutata kliendi muudatusi, cache kirjutatakse ainult serveri poolt tulevad muudatused. Serveriga ühenduse puudumisel on rakendus read-only reziimis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99041</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99041"/>
		<updated>2015-12-14T07:44:58Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Arenduse käigus selgus, et C# sisseehitatud System.Security.Cryptography teek toetab PBKDF2 algoritmi (rfc2898derivebytes meetod) puhul ainult SHA-1 räsifunktsiooni, mis on vananenud. Samuti ei tundu seal olevat timing attackide kindlat baidivektorite võrdlusmeetodit. Hetkel kuna turvanõuded rakendusele on suhteliselt madalad, on tegu aktsepteeritava riskiga, kuid mingi tegeliku programmi loomisel tuleks kindlasti kasutada alternatiive, näiteks libsodium-net.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=99011</id>
		<title>Juhend: Kodutöö aines &quot;Programmeerimine CSharp keeles&quot; (2015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=99011"/>
		<updated>2015-12-13T21:20:02Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Meeskond: Spooky Scary Skeletons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
=Kodutöö aines &amp;quot;Programmeerimine C# keeles&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
==Eesmärk==&lt;br /&gt;
Saada praktiline arenduskogemus .NET keskkonnas ning arendada meeskonnatöö kogemust ja analüüsivõimet. Kasutada arendusprotsessis koodihoidlat.&lt;br /&gt;
&lt;br /&gt;
==Reeglid==&lt;br /&gt;
Ühte projektimeeskonda kuulub 3-5 tudengit(Soovituslik meeskonna suurus on 3-4). Ühel teemal võib teostada projekti üks või mitu meeskonda.Töö käiku kajastatakse https://wiki.itcollege.ee keskkonnas või soovi korral võib seda teha ka ajaveebis(blogis).&lt;br /&gt;
Ajaveebi pidamise eesmärke on kaks: nii on võimalik kirja panna kõik mõtted ja ideed (ning nendest jääb jälg ja dokumentatsioon) ning õppejõul on hiljem võimalik saada ülevaade iga projektimeeskonna liikme panusest. Ajaveebi loob ja ajaveebi haldab projektimeeskond vabalt valitud (avalikus) keskkonnas. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekti loomine ja arendamine &#039;&#039;&#039;&lt;br /&gt;
Projekt lisatakse versioonihaldusesse, kasutades selleks [Team Foundation Service&#039;it http://tfs.visualstudio.com/] ning õppejõule antakse ligipääs. Õppejõu live id: maitposka ät hotmail.com . Projekt peab olema alates algfaasist lisatud TFSi ning kogu tööprotsess toimub versioonihaldust kasutades&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööde esitamine&#039;&#039;&#039; (prototüüb ja lõpptoode)&lt;br /&gt;
Töö esitamisel pakitakse see kokku ning lisatakse wiki leheküljele link lähtekoodile. Kui töö lähtekoodi ei soovita mingil põhjusel avalikustata, tuleb õppejõuga selle jaoks sõlmida eraldi kokkulepe. Lähtekood on vajalik, et tööd oleks võimalik hinnata nii õppejõul kui kaastudengitel selle kohta retsensiooni kirjutada.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Team Foundation Service kasutamine&#039;&#039;&#039; (tänasel päeval &#039;&#039; Visual Studio online&#039;&#039;)&lt;br /&gt;
[http://www.visualstudio.com/get-started/sign-up-for-visual-studio-online Step-by-Step juhend]&lt;br /&gt;
&lt;br /&gt;
NB! Siia tuleb õppejõu poolt lihtne screencast ka, kuid ideeliselt ei tohiks selle kasutamine olla väga keeruline.&lt;br /&gt;
&lt;br /&gt;
==Tähtaegadest kinnipidamine==&lt;br /&gt;
Projekt jaguneb alamosadeks, millele on määratud tähtajad. Tähtaegade ületamisel võimalike punkte ei kaotata. Kui töö aga on esitatud tähtajaks, siis on võimalik selle eest teenida boonuspunkte (enamasti 0-10% võimalikust maksimumist boonust). Enne tähtaega esitatud töö ei tähenda automaatselt maksimumpunkte, kui see ei ole sooritatud korralikult.&lt;br /&gt;
&lt;br /&gt;
==Hindamine==&lt;br /&gt;
Teostatuks loetakse projekt juhul, kui lähteülesanne on realiseeritud, lahendus on töötav, kuid esineb suuremaid vigu ning piirsituatsioonidega ei ole arvestatud.&lt;br /&gt;
Maksimumtulemuse saavutamiseks peab projekt olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus. Tehnilisi ja vormistuslike puudujääke on võimalik korvata lisavõimaluste realiseerimisega.Üldjuhul tuleb loodud lahendust ka praktikumides või loengutes teistele tudengitele tutvustada (ca 10 min).&lt;br /&gt;
Nagu eelpool mainitud, koosneb projekt erinevatest osadest. Punktide arvu määramisel arvestatakse ka tähtajast kinni pidamist, mille toimimisloogika on kirjeldatud eespool.&lt;br /&gt;
&lt;br /&gt;
===Meeskonna kokkupanek ja idee===&lt;br /&gt;
&#039;&#039;&#039;25.10.2015&#039;&#039;&#039; (2p)&lt;br /&gt;
&lt;br /&gt;
Tekitatakse meeskonna wiki lehekülg. Meeskonnal peab olema nimi ning see koosneb  kolmest kuni viiest liikmest. Määratakse projektijuht. Juhul kui hakatakse blogi pidama kuskil mujal keskkonnas ilmub selle kohta link. Lühidalt peaks kirjeldama idee olemust nii, et selle üldine suund oleks arusaadav. Samuti peab olema märgitud tehnoloogia, milles hakatakse rakendust looma. Meeskond on loonud TFSi konto ning on saatnud õppejõule kutse.&lt;br /&gt;
&lt;br /&gt;
===Analüüs===&lt;br /&gt;
&#039;&#039;&#039;01.11.2015&#039;&#039;&#039; (6p)&lt;br /&gt;
Analüütilise osa eesmärgiks on arendada tudengite analüüsioskust, mida on vaja ka päris tarkvaraarenduse protsessi juures.&#039;&#039;&#039;NB! Miinimum sõnade arv 700&#039;&#039;&#039; Selle osa käigus peab valmima loodava rakenduse analüüs, mis sisaldab muu hulgas ka:&lt;br /&gt;
*Analüüs rakendusele. (Mida see endas sisaldab? Mis on selle eesmärk? Mida tavakasutaja sellega teha saaks? Milliste osade realiseerimine võib osutuda problemaatiliseks?) Kui on tööjaotus paigas, siis tuua ka see välja.&lt;br /&gt;
*Tuua välja nimekiri funktsionaalsusest, mida plaanitakse kindlasti teostada(&#039;&#039;Must have&#039;&#039;)&lt;br /&gt;
*Nimekiri funktsionaalsustest, mis võiks olla, aga mida ei pruugita ajapuuduse tõttu realiseerida.(&#039;&#039;Nice to have&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 8.11.2015 (3p)&lt;br /&gt;
&lt;br /&gt;
===Prototüüp===&lt;br /&gt;
&#039;&#039;&#039;13.12.2015 23:58&#039;&#039;&#039;(10p)&lt;br /&gt;
&lt;br /&gt;
Valmib projekti esmane realisatsioon. Laias laastus on peafunktsionaalsused realiseeritud(Nimekiri funktsionaalsusest, mida plaanitakse teostada).  Programmis võib esineda üksikuid, kuid mitte väga suuri vigu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 20.12.2015(5p)&lt;br /&gt;
&lt;br /&gt;
===Lõpptoode===&lt;br /&gt;
&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;(20p)&lt;br /&gt;
Selleks faasiks peab projekt maksimumpuntkide saavutamiseks olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 27.01.2016(5p)&lt;br /&gt;
&lt;br /&gt;
===Esitlus/Kaitsmine=== &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Toimub loengutes/praktikumides või kokkulepitud ajal enne eksamit&#039;&#039;&#039; &#039;&#039;(4p) &#039;&#039;&lt;br /&gt;
Esitlusel kaitstakse projekti. Tutvustatakse tehnoloogiat, mida kasutati rakenduse realiseerimiseks.  Lühidalt räägitakse tööjaotusest ning probleemidest, mis tekkisid projekti realiseerimisel. Näidatakse lähtekoodi ja demonstreeritakse oma rakendust teistele tudengitele, kes võivad selle kohta küsimusi küsida. Kestvus ~20min.&lt;br /&gt;
&lt;br /&gt;
====Kaitsmise ajad====&lt;br /&gt;
&lt;br /&gt;
Tere, iga aja taha kirjutada meeskonna nimi, kes tuleb oma tööd kaitsma. Aegu palun täita võimaluse korral järjest.&lt;br /&gt;
&lt;br /&gt;
Ideaalne esitlus, sisaldab endas ka powerpointi, kus on&lt;br /&gt;
*väljatoodud meeskonna nimi ja liikmed&lt;br /&gt;
*idee&lt;br /&gt;
*realiseerimine&lt;br /&gt;
*mis oli keerukas?&lt;br /&gt;
*mida uut õpiti?&lt;br /&gt;
*mõnede keerulisemate probleemide lahendamine&lt;br /&gt;
*meeskonnaliikmete panus&lt;br /&gt;
&lt;br /&gt;
Kaitsmise käigus vaadatakse üle ka kood.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Esmaspäev&#039;&#039;&#039; - 14.12.2015&lt;br /&gt;
*14:00 -&lt;br /&gt;
*14:15 -&lt;br /&gt;
*14:30 -&lt;br /&gt;
*14:45 -&lt;br /&gt;
*15:00 -&lt;br /&gt;
*15:15 - &lt;br /&gt;
&lt;br /&gt;
*16:00 - [https://wiki.itcollege.ee/index.php?title=Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
*16:15 - [[Meeskond: Travo]]&lt;br /&gt;
*16:30 - GlobalElite&lt;br /&gt;
*16:45 - [https://wiki.itcollege.ee/index.php/BIT BIT]&lt;br /&gt;
*17:00 - Konsa&lt;br /&gt;
*17:15 - KTM Development&lt;br /&gt;
*17:30 - MinuKV&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neljapäev&#039;&#039;&#039; - 17.12.2015&lt;br /&gt;
*08:15 - VVA&lt;br /&gt;
*08:30 - mc2&lt;br /&gt;
*08:45 - PenguinHorde&lt;br /&gt;
*09:00 - Sporto&lt;br /&gt;
*09:15 - Incman&lt;br /&gt;
*09:30 - Lebokeiss OÜ&lt;br /&gt;
&lt;br /&gt;
*10:00 -Kodune raamat&lt;br /&gt;
*10:15 - &lt;br /&gt;
*10:30 - &lt;br /&gt;
*10:45 -&lt;br /&gt;
*11:00 -&lt;br /&gt;
*11:15 -&lt;br /&gt;
&lt;br /&gt;
=Teemad 2015 sügis=&lt;br /&gt;
Kodutööna tuleb luua:&lt;br /&gt;
&lt;br /&gt;
==Nõuded rakendusele==&lt;br /&gt;
Loodav rakendus peab:&lt;br /&gt;
* Peab kasutama andmebaasi (erikokkuleppel ka XML formaadis andmeallikat)&lt;br /&gt;
**Andmebaasis peab olema vähemalt 6 andmebaasi tabelit&lt;br /&gt;
* Peab võimaldama tegevuste kohta registri pidamist (logi)&lt;br /&gt;
**Rakenduses tehtavad tegevused salvestatakse&lt;br /&gt;
* Kasutama kasutajaliidesena ühte järgmistest: Windows Presentation Foundation, Windows Phone , Windows Store App või ASP.Net&lt;br /&gt;
* Kood on kommenteeritud ning rakendus on varustatud dokumentatsiooniga&lt;br /&gt;
* Maksimumpunktide jaoks kasutatakse vastavalt valitud tehnoloogiale soovitatud arendusmustreid&lt;br /&gt;
* Kood on kirjutatud C# programmeerimiskeeles&lt;br /&gt;
**Kuna aine nimi on &amp;quot;Programmeerimine C# keeles&amp;quot; ei tohi esitada rakendust, mis on loodud Javas, PHPs vms keeles&lt;br /&gt;
* Rakendus on jaotatud kihtidesse&lt;br /&gt;
&#039;&#039;&#039;Loodav rakendus peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
*Kood on kommenteeritud&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea äriidee&lt;br /&gt;
&lt;br /&gt;
==Kodune raamatukogu==&lt;br /&gt;
Kodudes on tihti erinevaid raamatuid (filme, muud nänni) ja sõbrad tahavad neid vahel laenutada.&lt;br /&gt;
Loo rakendus, mis&lt;br /&gt;
* Võimaldaks sisestada kodused raamatud&lt;br /&gt;
* Võimaldaks luua laenutajate profiile&lt;br /&gt;
* Raamatuid välja laenutada (tähtajaliselt)&lt;br /&gt;
* Laseks koostada erinevaid aruandeid (kodusolevad raamatud, väljalaenutatud raamatud, tähtaja ületanud laenutused  jne)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Kui laenutaja profiilis on e-mail, siis saada automaatselt e-kiri „kallis sõber see ja see, Sinu käes on minu raamat, kas tood tagasi ka?”&lt;br /&gt;
* Kuva hoiatused, kui laenutaja laenutuste ajalugu on vilets või kui mõni raamat on tagastamata.&lt;br /&gt;
* Lase lisada raamatutele pilt&lt;br /&gt;
* Loo lihtne veebiliides (et sõbrad saaksid veebist vaadata, mis raamatud kasutajal  kodus veel alles on)&lt;br /&gt;
Või&lt;br /&gt;
&lt;br /&gt;
==CRM==&lt;br /&gt;
Oma klientidest peab olema ülevaade.&lt;br /&gt;
Loo rakendus, mis võimaldab:&lt;br /&gt;
* Kliente ning nende kontaktisikuid sisestada, muuta ning kustutada&lt;br /&gt;
* Võimalda sisestada kliendikontakte&lt;br /&gt;
* Koostada hinnapakkumisi klientidele, kusjuures hinnapakkumine lisatakse süsteemi ka kui kliendikontakt ning saadetakse samast süsteemist kliendile.&lt;br /&gt;
* Kliendi andmete vaatamisel kuvatakse ka kliendikontaktid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Loo võimalus, kus kontaktisiku sünnipäeva saabumisel saadetakse automaatselt inimesele meil õnnesoovidega&lt;br /&gt;
* Õnnitlusmeilide template’sid võiks olla mitu&lt;br /&gt;
* Loo võimalus kliendi huvide (huvialade) kajastamiseks süsteemis&lt;br /&gt;
&lt;br /&gt;
==Mäng(Unit)==&lt;br /&gt;
Loodav mäng peab sisaldama:&lt;br /&gt;
* Erinevaid tasemeid&lt;br /&gt;
* Punktiarvestust&lt;br /&gt;
* XBox puldi tuge&lt;br /&gt;
* Klaviatuurilt juhtimise tuge&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loodav mäng peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea &#039;&#039;story&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Meeskonnad 2015=&lt;br /&gt;
==Päevaõpe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MinuKV===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vanessa Vorteil&lt;br /&gt;
*Martin Luik&lt;br /&gt;
*Ahto Elken&lt;br /&gt;
*Taavi Kusmin&lt;br /&gt;
*Silver Ohlo&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MinuKV]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Travo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarvo Reinpalu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Travo]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Freshmen===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Haas - Projektijuht&lt;br /&gt;
*Piret Pomerants&lt;br /&gt;
*Semjon Greef &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Freshmen Freshmen]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Retsensioon Qlibrium analüüsi [https://wiki.itcollege.ee/index.php/Talk:Qlibrium kohta]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: mc2===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Betlem&lt;br /&gt;
*Johannes Tamm&lt;br /&gt;
*Martin Mägi&lt;br /&gt;
*Jana Pipar &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: mc2]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_MinuKV_kohta#Retsensioon_MinuKV_kohta Retsensioon MinuKV kohta]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meie prototüüp asub [https://wiki.itcollege.ee/index.php/Meeskond:_mc2#Protot.C3.BC.C3.BCp SIIN]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sporto===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kelli Lukas&lt;br /&gt;
*Vladimir Rõkovanov&lt;br /&gt;
*Alar Ameerikas&lt;br /&gt;
*Mikk Raudsepp&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Sporto  Sporto]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LetsDoIt===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Liisa Suurkaev(projektijuht)&lt;br /&gt;
*Melissa Eenmaa&lt;br /&gt;
*Tanel Vähk&lt;br /&gt;
*Taavi Kliss&lt;br /&gt;
*Aleks Luik&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale LendBook asub [https://wiki.itcollege.ee/index.php/Talk:LendBook retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
===Meeskond: VVA===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vladislav Lahtarin&lt;br /&gt;
*Vladislav Kovaltšuk&lt;br /&gt;
*Aleksandr Babõkin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_VVA Meeskond:_VVA]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: IncMan===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sergei Fatejev&lt;br /&gt;
*Nele Sergejeva&lt;br /&gt;
*Marko Koiduste&lt;br /&gt;
*Kaspar Tilk&lt;br /&gt;
*Jaanus Türnpuu&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Incman IncMan]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LetsDoIt&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LetsDoIt siin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Lebokeiss OÜ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Joonas Jõeleht - Projektijuht&lt;br /&gt;
*Iris Tambaum&lt;br /&gt;
*Timo Lanno&lt;br /&gt;
*Karell Veskimeister&lt;br /&gt;
*Kerli Edasi &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Lebokeiss_OÜ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo | Retsensioon meeskond Travo analüüsile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LendBook===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Egle Arge&lt;br /&gt;
*Liina Kolk&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[LendBook]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:PenguinHorde | Retsensioon meeskonna PenguinHorde analüüsile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: BIT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Merilyn Renser&lt;br /&gt;
*Marko Hartikainen&lt;br /&gt;
*Ants Kristjan Rooma&lt;br /&gt;
*Konstantin Burdakov&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[BIT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[VVA analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: PenguinHorde===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Laura Leon&lt;br /&gt;
*Marko Saluste&lt;br /&gt;
*Terje Sõelsepp&lt;br /&gt;
*Mari-Liis Oldja&lt;br /&gt;
Meeskonna koduleht: [[PenguinHorde]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: GlobalElite===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Kivikink&lt;br /&gt;
*Indrek Nurja&lt;br /&gt;
*Imre Teras&lt;br /&gt;
*Aapo Kersalu&lt;br /&gt;
*Erling Tammisto&lt;br /&gt;
Meeskonna koduleht: [[GlobalLite]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: KTM Development===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kristian Laupa&lt;br /&gt;
*Tauno Otti&lt;br /&gt;
*Mart Abel&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_KTM_Development KTM Development]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;mc2&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/User_talk:Klaupa siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Bob?===&lt;br /&gt;
Liige:&lt;br /&gt;
*Priit Aarne&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Bob Bob?]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: RJ===&lt;br /&gt;
Liige:&lt;br /&gt;
*Richard Jalonen&lt;br /&gt;
Meeskonna koduleht: [[RJ]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Qlibrium===&lt;br /&gt;
Liige:&lt;br /&gt;
*Karl Frank&lt;br /&gt;
Meeskonna koduleht [[Qlibrium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_GlobalLite_*#Meeskonna_GlobalLite_anal.C3.BC.C3.BCsi_retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Kodune Raamat===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Osa&lt;br /&gt;
*Taavi Kivimaa&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Kodune_Raamat Kodune Raamat]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TaTa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Talis Tammearu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:TaTa]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Ktreikel===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kert Treikelder&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_ktreikel]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmeerimine CSharp keeles (2015) (Päevaõpe)]]&lt;br /&gt;
&lt;br /&gt;
==Kaugõpe==&lt;br /&gt;
===Meeskond: Premium===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarmo Petrovits&lt;br /&gt;
*Karin Talumäe&lt;br /&gt;
*Jevgeni Gavrilov &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Premium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Spooky Scary Skeletons===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kärt Palm DK22 &lt;br /&gt;
*Karina Egipt DK22 (Projektijuht)&lt;br /&gt;
*Erika Ehmann D32 &lt;br /&gt;
*Silver Saks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Spooky Scary Skeletons]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Esimene Prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Premium Retsensioon meeskonna Premium projekti HomeLibrary analüüsile]&lt;br /&gt;
&lt;br /&gt;
=== Meeskond: Nocturne No. 20 in C-sharp Minor ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*10142848 (Projektijuht)&lt;br /&gt;
*10090107&lt;br /&gt;
*10143193&lt;br /&gt;
*10143313&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LIB===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sigrid Pachel DK22 (Projektijuht)&lt;br /&gt;
*Diana Nikolajeva DK22&lt;br /&gt;
*Kristjan Adrat DK41&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: LIB]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond_Mardo Analüüsi retsensioon Mardo meeskonnale]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Greek?Mark===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Karit Kilgi DK22 (Projektijuht)&lt;br /&gt;
*Sten Kaasik DK22&lt;br /&gt;
*Siim Veskilt DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: GreekQMark]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Tarraxacum===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Silja Kralik DK21 (Projektijuht)&lt;br /&gt;
*Liina Laumets DK21 &lt;br /&gt;
*Ragne Auling DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Tarraxacum]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon meeskonnale Põhjavesi]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Fontastic===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Erik Hirmo DK22 (Projektijuht)&lt;br /&gt;
*Piret Reinumägi DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Fontastic]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Konsa Retsensioon meeskonna Konsa projekti Ostukorv analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TTT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Ave Karjus DK22 &lt;br /&gt;
*Joonatan Uusväli DK22 (Projektijuht)&lt;br /&gt;
*Kaidar Viikman DK21 (Wiki pidaja)&lt;br /&gt;
*Oliver Tiks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: TTT (Trellid Teevad Tugevaks) | TTT (Trellid Teevad Tugevaks)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_GreekQMark#section=1 | Retsensioon meeskonna Greek?Mark projekti analüüsile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Codezilla===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Anna Linskaja DK21 (Projektijuht)&lt;br /&gt;
*Alisa Dudinova DK21 &lt;br /&gt;
*Sergei Hristoforov DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Codezilla]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Maker Retsensioon meeskonna Maker projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Konsa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
&lt;br /&gt;
*Marko Konsa DK13&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Ostukorv]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Johhaidii===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Yogesh Sharma&lt;br /&gt;
*Juhan Trink&lt;br /&gt;
*Marju Niinemaa&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Johhaidii]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_Makerile Retsensioon meeskonna Maker analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sildur===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Andreas Papp (Projektijuht)&lt;br /&gt;
*Germo Väli&lt;br /&gt;
*Andres Trei&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Sildur]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: JT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tõnis Luik (Projektijuht)&lt;br /&gt;
*Juri Nikitin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[JT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Maker===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Öövel (Projektijuht)&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Maker]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Codezilla Retsensioon meeskonna Codezilla analüüsile]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Põhjavesi===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Indrek Pruul (Projektijuht)&lt;br /&gt;
*Jan Eerik&lt;br /&gt;
*Eeva Koplimets&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Pohjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Pohjavesi Retsensioon meeskonnale Spooky Scary Skeletons analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MMTL development===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Martin Mänd (Projektijuht)&lt;br /&gt;
*Taavi Lõhmus&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MMTL development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Mardo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Mardo Halapuu&lt;br /&gt;
Meeskonna koduleht:[https://wiki.itcollege.ee/index.php/Meeskond_Mardo Mardo]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99010</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=99010"/>
		<updated>2015-12-13T21:18:45Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Avaldatud failid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=0e79ef0570f39b8743f046c70f724404 Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;11.12.2015&#039;&#039;&#039;    - Prototüübi esimese versiooni lisamine Wiki lehele.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi teise versiooni lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_proto20151213.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid. Taskile vajutades avaneb taski detailvaade;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed koos võimalusega taski muuta või kustutada;&lt;br /&gt;
*Kasutaja saab sisestatud taski andmeid muuta ja taski kustutada;&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=98964</id>
		<title>Juhend: Kodutöö aines &quot;Programmeerimine CSharp keeles&quot; (2015)</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Juhend:_Kodut%C3%B6%C3%B6_aines_%22Programmeerimine_CSharp_keeles%22_(2015)&amp;diff=98964"/>
		<updated>2015-12-13T19:52:07Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Meeskond: Spooky Scary Skeletons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
=Kodutöö aines &amp;quot;Programmeerimine C# keeles&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
==Eesmärk==&lt;br /&gt;
Saada praktiline arenduskogemus .NET keskkonnas ning arendada meeskonnatöö kogemust ja analüüsivõimet. Kasutada arendusprotsessis koodihoidlat.&lt;br /&gt;
&lt;br /&gt;
==Reeglid==&lt;br /&gt;
Ühte projektimeeskonda kuulub 3-5 tudengit(Soovituslik meeskonna suurus on 3-4). Ühel teemal võib teostada projekti üks või mitu meeskonda.Töö käiku kajastatakse https://wiki.itcollege.ee keskkonnas või soovi korral võib seda teha ka ajaveebis(blogis).&lt;br /&gt;
Ajaveebi pidamise eesmärke on kaks: nii on võimalik kirja panna kõik mõtted ja ideed (ning nendest jääb jälg ja dokumentatsioon) ning õppejõul on hiljem võimalik saada ülevaade iga projektimeeskonna liikme panusest. Ajaveebi loob ja ajaveebi haldab projektimeeskond vabalt valitud (avalikus) keskkonnas. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Projekti loomine ja arendamine &#039;&#039;&#039;&lt;br /&gt;
Projekt lisatakse versioonihaldusesse, kasutades selleks [Team Foundation Service&#039;it http://tfs.visualstudio.com/] ning õppejõule antakse ligipääs. Õppejõu live id: maitposka ät hotmail.com . Projekt peab olema alates algfaasist lisatud TFSi ning kogu tööprotsess toimub versioonihaldust kasutades&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tööde esitamine&#039;&#039;&#039; (prototüüb ja lõpptoode)&lt;br /&gt;
Töö esitamisel pakitakse see kokku ning lisatakse wiki leheküljele link lähtekoodile. Kui töö lähtekoodi ei soovita mingil põhjusel avalikustata, tuleb õppejõuga selle jaoks sõlmida eraldi kokkulepe. Lähtekood on vajalik, et tööd oleks võimalik hinnata nii õppejõul kui kaastudengitel selle kohta retsensiooni kirjutada.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Team Foundation Service kasutamine&#039;&#039;&#039; (tänasel päeval &#039;&#039; Visual Studio online&#039;&#039;)&lt;br /&gt;
[http://www.visualstudio.com/get-started/sign-up-for-visual-studio-online Step-by-Step juhend]&lt;br /&gt;
&lt;br /&gt;
NB! Siia tuleb õppejõu poolt lihtne screencast ka, kuid ideeliselt ei tohiks selle kasutamine olla väga keeruline.&lt;br /&gt;
&lt;br /&gt;
==Tähtaegadest kinnipidamine==&lt;br /&gt;
Projekt jaguneb alamosadeks, millele on määratud tähtajad. Tähtaegade ületamisel võimalike punkte ei kaotata. Kui töö aga on esitatud tähtajaks, siis on võimalik selle eest teenida boonuspunkte (enamasti 0-10% võimalikust maksimumist boonust). Enne tähtaega esitatud töö ei tähenda automaatselt maksimumpunkte, kui see ei ole sooritatud korralikult.&lt;br /&gt;
&lt;br /&gt;
==Hindamine==&lt;br /&gt;
Teostatuks loetakse projekt juhul, kui lähteülesanne on realiseeritud, lahendus on töötav, kuid esineb suuremaid vigu ning piirsituatsioonidega ei ole arvestatud.&lt;br /&gt;
Maksimumtulemuse saavutamiseks peab projekt olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus. Tehnilisi ja vormistuslike puudujääke on võimalik korvata lisavõimaluste realiseerimisega.Üldjuhul tuleb loodud lahendust ka praktikumides või loengutes teistele tudengitele tutvustada (ca 10 min).&lt;br /&gt;
Nagu eelpool mainitud, koosneb projekt erinevatest osadest. Punktide arvu määramisel arvestatakse ka tähtajast kinni pidamist, mille toimimisloogika on kirjeldatud eespool.&lt;br /&gt;
&lt;br /&gt;
===Meeskonna kokkupanek ja idee===&lt;br /&gt;
&#039;&#039;&#039;25.10.2015&#039;&#039;&#039; (2p)&lt;br /&gt;
&lt;br /&gt;
Tekitatakse meeskonna wiki lehekülg. Meeskonnal peab olema nimi ning see koosneb  kolmest kuni viiest liikmest. Määratakse projektijuht. Juhul kui hakatakse blogi pidama kuskil mujal keskkonnas ilmub selle kohta link. Lühidalt peaks kirjeldama idee olemust nii, et selle üldine suund oleks arusaadav. Samuti peab olema märgitud tehnoloogia, milles hakatakse rakendust looma. Meeskond on loonud TFSi konto ning on saatnud õppejõule kutse.&lt;br /&gt;
&lt;br /&gt;
===Analüüs===&lt;br /&gt;
&#039;&#039;&#039;01.11.2015&#039;&#039;&#039; (6p)&lt;br /&gt;
Analüütilise osa eesmärgiks on arendada tudengite analüüsioskust, mida on vaja ka päris tarkvaraarenduse protsessi juures.&#039;&#039;&#039;NB! Miinimum sõnade arv 700&#039;&#039;&#039; Selle osa käigus peab valmima loodava rakenduse analüüs, mis sisaldab muu hulgas ka:&lt;br /&gt;
*Analüüs rakendusele. (Mida see endas sisaldab? Mis on selle eesmärk? Mida tavakasutaja sellega teha saaks? Milliste osade realiseerimine võib osutuda problemaatiliseks?) Kui on tööjaotus paigas, siis tuua ka see välja.&lt;br /&gt;
*Tuua välja nimekiri funktsionaalsusest, mida plaanitakse kindlasti teostada(&#039;&#039;Must have&#039;&#039;)&lt;br /&gt;
*Nimekiri funktsionaalsustest, mis võiks olla, aga mida ei pruugita ajapuuduse tõttu realiseerida.(&#039;&#039;Nice to have&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 8.11.2015 (3p)&lt;br /&gt;
&lt;br /&gt;
===Prototüüp===&lt;br /&gt;
&#039;&#039;&#039;13.12.2015 23:58&#039;&#039;&#039;(10p)&lt;br /&gt;
&lt;br /&gt;
Valmib projekti esmane realisatsioon. Laias laastus on peafunktsionaalsused realiseeritud(Nimekiri funktsionaalsusest, mida plaanitakse teostada).  Programmis võib esineda üksikuid, kuid mitte väga suuri vigu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 20.12.2015(5p)&lt;br /&gt;
&lt;br /&gt;
===Lõpptoode===&lt;br /&gt;
&#039;&#039;&#039;20.01.2016&#039;&#039;&#039;(20p)&lt;br /&gt;
Selleks faasiks peab projekt maksimumpuntkide saavutamiseks olema teostatud tehniliselt veatult ning varustatud dokumentatsiooniga, milles sisaldub arendusprotsessi kirjeldus (peab selguma ka iga rühmaliikme panus projekti teostamisel), kasutajajuhend ning lahenduse kirjeldus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039; 27.01.2016(5p)&lt;br /&gt;
&lt;br /&gt;
===Esitlus/Kaitsmine=== &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Toimub loengutes/praktikumides või kokkulepitud ajal enne eksamit&#039;&#039;&#039; &#039;&#039;(4p) &#039;&#039;&lt;br /&gt;
Esitlusel kaitstakse projekti. Tutvustatakse tehnoloogiat, mida kasutati rakenduse realiseerimiseks.  Lühidalt räägitakse tööjaotusest ning probleemidest, mis tekkisid projekti realiseerimisel. Näidatakse lähtekoodi ja demonstreeritakse oma rakendust teistele tudengitele, kes võivad selle kohta küsimusi küsida. Kestvus ~20min.&lt;br /&gt;
&lt;br /&gt;
====Kaitsmise ajad====&lt;br /&gt;
&lt;br /&gt;
Tere, iga aja taha kirjutada meeskonna nimi, kes tuleb oma tööd kaitsma. Aegu palun täita võimaluse korral järjest.&lt;br /&gt;
&lt;br /&gt;
Ideaalne esitlus, sisaldab endas ka powerpointi, kus on&lt;br /&gt;
*väljatoodud meeskonna nimi ja liikmed&lt;br /&gt;
*idee&lt;br /&gt;
*realiseerimine&lt;br /&gt;
*mis oli keerukas?&lt;br /&gt;
*mida uut õpiti?&lt;br /&gt;
*mõnede keerulisemate probleemide lahendamine&lt;br /&gt;
*meeskonnaliikmete panus&lt;br /&gt;
&lt;br /&gt;
Kaitsmise käigus vaadatakse üle ka kood.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Esmaspäev&#039;&#039;&#039; - 14.12.2015&lt;br /&gt;
*14:00 -&lt;br /&gt;
*14:15 -&lt;br /&gt;
*14:30 -&lt;br /&gt;
*14:45 -&lt;br /&gt;
*15:00 -&lt;br /&gt;
*15:15 -&lt;br /&gt;
&lt;br /&gt;
*16:00 - [https://wiki.itcollege.ee/index.php?title=Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
*16:15 - [[Meeskond: Travo]]&lt;br /&gt;
*16:30 - GlobalElite&lt;br /&gt;
*16:45 - [https://wiki.itcollege.ee/index.php/BIT BIT]&lt;br /&gt;
*17:00 - Konsa&lt;br /&gt;
*17:15 - KTM Development&lt;br /&gt;
*17:30 - MinuKV&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Neljapäev&#039;&#039;&#039; - 17.12.2015&lt;br /&gt;
*08:15 - VVA&lt;br /&gt;
*08:30 - mc2&lt;br /&gt;
*08:45 - PenguinHorde&lt;br /&gt;
*09:00 - Sporto&lt;br /&gt;
*09:15 - Incman&lt;br /&gt;
*09:30 - Lebokeiss OÜ&lt;br /&gt;
&lt;br /&gt;
*10:00 -&lt;br /&gt;
*10:15 - &lt;br /&gt;
*10:30 - &lt;br /&gt;
*10:45 -&lt;br /&gt;
*11:00 -&lt;br /&gt;
*11:15 -&lt;br /&gt;
&lt;br /&gt;
=Teemad 2015 sügis=&lt;br /&gt;
Kodutööna tuleb luua:&lt;br /&gt;
&lt;br /&gt;
==Nõuded rakendusele==&lt;br /&gt;
Loodav rakendus peab:&lt;br /&gt;
* Peab kasutama andmebaasi (erikokkuleppel ka XML formaadis andmeallikat)&lt;br /&gt;
**Andmebaasis peab olema vähemalt 6 andmebaasi tabelit&lt;br /&gt;
* Peab võimaldama tegevuste kohta registri pidamist (logi)&lt;br /&gt;
**Rakenduses tehtavad tegevused salvestatakse&lt;br /&gt;
* Kasutama kasutajaliidesena ühte järgmistest: Windows Presentation Foundation, Windows Phone , Windows Store App või ASP.Net&lt;br /&gt;
* Kood on kommenteeritud ning rakendus on varustatud dokumentatsiooniga&lt;br /&gt;
* Maksimumpunktide jaoks kasutatakse vastavalt valitud tehnoloogiale soovitatud arendusmustreid&lt;br /&gt;
* Kood on kirjutatud C# programmeerimiskeeles&lt;br /&gt;
**Kuna aine nimi on &amp;quot;Programmeerimine C# keeles&amp;quot; ei tohi esitada rakendust, mis on loodud Javas, PHPs vms keeles&lt;br /&gt;
* Rakendus on jaotatud kihtidesse&lt;br /&gt;
&#039;&#039;&#039;Loodav rakendus peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
*Kood on kommenteeritud&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea äriidee&lt;br /&gt;
&lt;br /&gt;
==Kodune raamatukogu==&lt;br /&gt;
Kodudes on tihti erinevaid raamatuid (filme, muud nänni) ja sõbrad tahavad neid vahel laenutada.&lt;br /&gt;
Loo rakendus, mis&lt;br /&gt;
* Võimaldaks sisestada kodused raamatud&lt;br /&gt;
* Võimaldaks luua laenutajate profiile&lt;br /&gt;
* Raamatuid välja laenutada (tähtajaliselt)&lt;br /&gt;
* Laseks koostada erinevaid aruandeid (kodusolevad raamatud, väljalaenutatud raamatud, tähtaja ületanud laenutused  jne)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Kui laenutaja profiilis on e-mail, siis saada automaatselt e-kiri „kallis sõber see ja see, Sinu käes on minu raamat, kas tood tagasi ka?”&lt;br /&gt;
* Kuva hoiatused, kui laenutaja laenutuste ajalugu on vilets või kui mõni raamat on tagastamata.&lt;br /&gt;
* Lase lisada raamatutele pilt&lt;br /&gt;
* Loo lihtne veebiliides (et sõbrad saaksid veebist vaadata, mis raamatud kasutajal  kodus veel alles on)&lt;br /&gt;
Või&lt;br /&gt;
&lt;br /&gt;
==CRM==&lt;br /&gt;
Oma klientidest peab olema ülevaade.&lt;br /&gt;
Loo rakendus, mis võimaldab:&lt;br /&gt;
* Kliente ning nende kontaktisikuid sisestada, muuta ning kustutada&lt;br /&gt;
* Võimalda sisestada kliendikontakte&lt;br /&gt;
* Koostada hinnapakkumisi klientidele, kusjuures hinnapakkumine lisatakse süsteemi ka kui kliendikontakt ning saadetakse samast süsteemist kliendile.&lt;br /&gt;
* Kliendi andmete vaatamisel kuvatakse ka kliendikontaktid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lisavõimalused&lt;br /&gt;
* Loo võimalus, kus kontaktisiku sünnipäeva saabumisel saadetakse automaatselt inimesele meil õnnesoovidega&lt;br /&gt;
* Õnnitlusmeilide template’sid võiks olla mitu&lt;br /&gt;
* Loo võimalus kliendi huvide (huvialade) kajastamiseks süsteemis&lt;br /&gt;
&lt;br /&gt;
==Mäng(Unit)==&lt;br /&gt;
Loodav mäng peab sisaldama:&lt;br /&gt;
* Erinevaid tasemeid&lt;br /&gt;
* Punktiarvestust&lt;br /&gt;
* XBox puldi tuge&lt;br /&gt;
* Klaviatuurilt juhtimise tuge&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loodav mäng peab olema loodud objektorienteeritud lähenemist kasutades!&#039;&#039;&#039; Klassid, klassid, klassid&lt;br /&gt;
&lt;br /&gt;
Lisapunkte annab:&lt;br /&gt;
* Silmailu&lt;br /&gt;
* Kood on kirjutatud häid praktikaid järgides ja on veatu(testimine, testimine, testimine)&lt;br /&gt;
* Orginaalsed ideed ja hea &#039;&#039;story&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Meeskonnad 2015=&lt;br /&gt;
==Päevaõpe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MinuKV===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vanessa Vorteil&lt;br /&gt;
*Martin Luik&lt;br /&gt;
*Ahto Elken&lt;br /&gt;
*Taavi Kusmin&lt;br /&gt;
*Silver Ohlo&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MinuKV]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Travo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarvo Reinpalu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Travo]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Freshmen===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Haas - Projektijuht&lt;br /&gt;
*Piret Pomerants&lt;br /&gt;
*Semjon Greef &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Freshmen Freshmen]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Retsensioon Qlibrium analüüsi [https://wiki.itcollege.ee/index.php/Talk:Qlibrium kohta]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: mc2===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Martin Betlem&lt;br /&gt;
*Johannes Tamm&lt;br /&gt;
*Martin Mägi&lt;br /&gt;
*Jana Pipar &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: mc2]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_MinuKV_kohta#Retsensioon_MinuKV_kohta Retsensioon MinuKV kohta]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prototüüp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Meie prototüüp asub [https://wiki.itcollege.ee/index.php/Meeskond:_mc2#Protot.C3.BC.C3.BCp SIIN]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sporto===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kelli Lukas&lt;br /&gt;
*Vladimir Rõkovanov&lt;br /&gt;
*Alar Ameerikas&lt;br /&gt;
*Mikk Raudsepp&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Sporto  Sporto]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_KTM_Development Retsensioon meeskonna KTM Development projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LetsDoIt===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Liisa Suurkaev(projektijuht)&lt;br /&gt;
*Melissa Eenmaa&lt;br /&gt;
*Tanel Vähk&lt;br /&gt;
*Taavi Kliss&lt;br /&gt;
*Aleks Luik&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_LetsDoIt LetsDoIt]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale LendBook asub [https://wiki.itcollege.ee/index.php/Talk:LendBook retsensioon siin].&lt;br /&gt;
&lt;br /&gt;
===Meeskond: VVA===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Vladislav Lahtarin&lt;br /&gt;
*Vladislav Kovaltšuk&lt;br /&gt;
*Aleksandr Babõkin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_VVA Meeskond:_VVA]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: IncMan===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sergei Fatejev&lt;br /&gt;
*Nele Sergejeva&lt;br /&gt;
*Marko Koiduste&lt;br /&gt;
*Kaspar Tilk&lt;br /&gt;
*Jaanus Türnpuu&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Incman IncMan]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LetsDoIt&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LetsDoIt siin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Lebokeiss OÜ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Joonas Jõeleht - Projektijuht&lt;br /&gt;
*Iris Tambaum&lt;br /&gt;
*Timo Lanno&lt;br /&gt;
*Karell Veskimeister&lt;br /&gt;
*Kerli Edasi &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:_Lebokeiss_OÜ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_Travo | Retsensioon meeskond Travo analüüsile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LendBook===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Egle Arge&lt;br /&gt;
*Liina Kolk&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[LendBook]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:PenguinHorde | Retsensioon meeskonna PenguinHorde analüüsile]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: BIT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Merilyn Renser&lt;br /&gt;
*Marko Hartikainen&lt;br /&gt;
*Ants Kristjan Rooma&lt;br /&gt;
*Konstantin Burdakov&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[BIT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[VVA analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: PenguinHorde===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Laura Leon&lt;br /&gt;
*Marko Saluste&lt;br /&gt;
*Terje Sõelsepp&lt;br /&gt;
*Mari-Liis Oldja&lt;br /&gt;
Meeskonna koduleht: [[PenguinHorde]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: GlobalElite===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Kivikink&lt;br /&gt;
*Indrek Nurja&lt;br /&gt;
*Imre Teras&lt;br /&gt;
*Aapo Kersalu&lt;br /&gt;
*Erling Tammisto&lt;br /&gt;
Meeskonna koduleht: [[GlobalLite]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: KTM Development===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kristian Laupa&lt;br /&gt;
*Tauno Otti&lt;br /&gt;
*Mart Abel&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_KTM_Development KTM Development]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;mc2&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/User_talk:Klaupa siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Bob?===&lt;br /&gt;
Liige:&lt;br /&gt;
*Priit Aarne&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Bob Bob?]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Meeskonna IncMan analüüsi retsensioon]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: RJ===&lt;br /&gt;
Liige:&lt;br /&gt;
*Richard Jalonen&lt;br /&gt;
Meeskonna koduleht: [[RJ]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Qlibrium===&lt;br /&gt;
Liige:&lt;br /&gt;
*Karl Frank&lt;br /&gt;
Meeskonna koduleht [[Qlibrium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioon&#039;&#039;&#039;&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_GlobalLite_*#Meeskonna_GlobalLite_anal.C3.BC.C3.BCsi_retsensioon]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Kodune Raamat===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Siim Osa&lt;br /&gt;
*Taavi Kivimaa&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_Kodune_Raamat Kodune Raamat]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TaTa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Talis Tammearu&lt;br /&gt;
Meeskonna koduleht: [[Meeskond:TaTa]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Ktreikel===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kert Treikelder&lt;br /&gt;
Meeskonna koduleht: [https://wiki.itcollege.ee/index.php/Meeskond:_ktreikel]&lt;br /&gt;
&lt;br /&gt;
[[Category: Programmeerimine CSharp keeles (2015) (Päevaõpe)]]&lt;br /&gt;
&lt;br /&gt;
==Kaugõpe==&lt;br /&gt;
===Meeskond: Premium===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tarmo Petrovits&lt;br /&gt;
*Karin Talumäe&lt;br /&gt;
*Jevgeni Gavrilov &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Premium]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Analüüsi retsensioon meeskonnale &#039;&#039;&#039;LIB&#039;&#039;&#039; asub [https://wiki.itcollege.ee/index.php/Talk:Meeskond:_LIB siin]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Spooky Scary Skeletons===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Kärt Palm DK22 &lt;br /&gt;
*Karina Egipt DK22 (Projektijuht)&lt;br /&gt;
*Erika Ehmann D32 &lt;br /&gt;
*Silver Saks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Spooky Scary Skeletons]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE%20App%20Proto%2020151213.zip&amp;amp;download Esimene Prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Premium Retsensioon meeskonna Premium projekti HomeLibrary analüüsile]&lt;br /&gt;
&lt;br /&gt;
=== Meeskond: Nocturne No. 20 in C-sharp Minor ===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*10142848 (Projektijuht)&lt;br /&gt;
*10090107&lt;br /&gt;
*10143193&lt;br /&gt;
*10143313&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Nocturne No. 20 in C-sharp Minor]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Fontastic Retsensioon meeskonna Fontastic rakenduse analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: LIB===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Sigrid Pachel DK22 (Projektijuht)&lt;br /&gt;
*Diana Nikolajeva DK22&lt;br /&gt;
*Kristjan Adrat DK41&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: LIB]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond_Mardo Analüüsi retsensioon Mardo meeskonnale]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Greek?Mark===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Karit Kilgi DK22 (Projektijuht)&lt;br /&gt;
*Sten Kaasik DK22&lt;br /&gt;
*Siim Veskilt DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: GreekQMark]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Spooky_Scary_Skeletons Retsensioon meeskonna Spooky Scary Skeletons rakenduse AVE 2.0 analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Tarraxacum===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Silja Kralik DK21 (Projektijuht)&lt;br /&gt;
*Liina Laumets DK21 &lt;br /&gt;
*Ragne Auling DK22 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Tarraxacum]]&lt;br /&gt;
&lt;br /&gt;
[[Retsensioon meeskonnale Põhjavesi]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Fontastic===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Erik Hirmo DK22 (Projektijuht)&lt;br /&gt;
*Piret Reinumägi DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: Fontastic]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Meeskond:_Konsa Retsensioon meeskonna Konsa projekti Ostukorv analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: TTT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Ave Karjus DK22 &lt;br /&gt;
*Joonatan Uusväli DK22 (Projektijuht)&lt;br /&gt;
*Kaidar Viikman DK21 (Wiki pidaja)&lt;br /&gt;
*Oliver Tiks AK21&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: TTT (Trellid Teevad Tugevaks) | TTT (Trellid Teevad Tugevaks)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Talk:Meeskond:_GreekQMark#section=1 | Retsensioon meeskonna Greek?Mark projekti analüüsile]]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Codezilla===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Anna Linskaja DK21 (Projektijuht)&lt;br /&gt;
*Alisa Dudinova DK21 &lt;br /&gt;
*Sergei Hristoforov DK21 &lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Codezilla]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Maker Retsensioon meeskonna Maker projekti analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Konsa===&lt;br /&gt;
Liikmed:&lt;br /&gt;
&lt;br /&gt;
*Marko Konsa DK13&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Ostukorv]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: Johhaidii===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Yogesh Sharma&lt;br /&gt;
*Juhan Trink&lt;br /&gt;
*Marju Niinemaa&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Johhaidii]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Retsensioon_Makerile Retsensioon meeskonna Maker analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Sildur===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Andreas Papp (Projektijuht)&lt;br /&gt;
*Germo Väli&lt;br /&gt;
*Andres Trei&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Sildur]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
===Meeskond: JT===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Tõnis Luik (Projektijuht)&lt;br /&gt;
*Juri Nikitin&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[JT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Maker===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Marek Öövel (Projektijuht)&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Maker]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Codezilla Retsensioon meeskonna Codezilla analüüsile]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Põhjavesi===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Indrek Pruul (Projektijuht)&lt;br /&gt;
*Jan Eerik&lt;br /&gt;
*Eeva Koplimets&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Pohjavesi]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[https://wiki.itcollege.ee/index.php/Talk:Pohjavesi Retsensioon meeskonnale Spooky Scary Skeletons analüüsile]&lt;br /&gt;
&lt;br /&gt;
===Meeskond: MMTL development===&lt;br /&gt;
Liikmed&lt;br /&gt;
*Martin Mänd (Projektijuht)&lt;br /&gt;
*Taavi Lõhmus&lt;br /&gt;
&lt;br /&gt;
Meeskonna koduleht: [[Meeskond: MMTL development]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retsensioonid&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Meeskond: Mardo===&lt;br /&gt;
Liikmed:&lt;br /&gt;
*Mardo Halapuu&lt;br /&gt;
Meeskonna koduleht:[https://wiki.itcollege.ee/index.php/Meeskond_Mardo Mardo]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98963</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98963"/>
		<updated>2015-12-13T19:51:13Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Avaldatud failid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
*[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE%20App%20Proto%2020151213.zip&amp;amp;download Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_Application_proto20151211.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid, kuid nende kuvamine etteantud vormidesse veel realiseerimisel - antud funktsionaalsus ei ole prototüübi jaoks vajalik;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed (andmete muutmise funktsioon .DAL tasandil veel tealiseerimata).&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98962</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98962"/>
		<updated>2015-12-13T19:50:56Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Avaldatud failid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE%20App%20Proto%2020151213.zip&amp;amp;download Rakenduse esimene prototüüp (13.12.2015)]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_Application_proto20151211.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid, kuid nende kuvamine etteantud vormidesse veel realiseerimisel - antud funktsionaalsus ei ole prototüübi jaoks vajalik;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed (andmete muutmise funktsioon .DAL tasandil veel tealiseerimata).&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98961</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98961"/>
		<updated>2015-12-13T19:49:51Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Prototüüp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_Application_proto20151211.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid, kuid nende kuvamine etteantud vormidesse veel realiseerimisel - antud funktsionaalsus ei ole prototüübi jaoks vajalik;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed (andmete muutmise funktsioon .DAL tasandil veel tealiseerimata).&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt ei ole hetkel veel midagi tehtud(töötab API Hello World tasemel). Prototüüp on hetkel ainult kohaliku kasutusega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98918</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98918"/>
		<updated>2015-12-13T13:02:05Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Prototüüp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_Application_proto20151211.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid, kuid nende kuvamine etteantud vormidesse veel realiseerimisel - antud funktsionaalsus ei ole prototüübi jaoks vajalik;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed (andmete muutmise funktsioon .DAL tasandil veel tealiseerimata).&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt on realiseeritud kasutaja autentikatsioon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98917</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98917"/>
		<updated>2015-12-13T13:01:15Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Arendusprotsess */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
AVE e View sisaldab vaid kujunduselemente ning nendevahelisi seoses. Kogu view&#039;de vahetamise ja muu UI jaoks vajalik loogika on ehitaud ViewModel&#039;isse.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;08.10.2015&#039;&#039;&#039;    - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039;    - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;01.11.2015&#039;&#039;&#039;    - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;06.11.2015&#039;&#039;&#039;    - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039;    - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039;    - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039;    - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039;    - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039;    - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039;    - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039;    - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039;    - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
*&#039;&#039;&#039;04.12.2015&#039;&#039;&#039;    - Konsultatsioon õppejõuga.&lt;br /&gt;
*&#039;&#039;&#039;10-13.12.2015&#039;&#039;&#039; - Viies kohtumine ja rakenduse arendamine.&lt;br /&gt;
*&#039;&#039;&#039;13.12.2015&#039;&#039;&#039;    - Prototüübi lisamine Wiki lehele.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;br /&gt;
&lt;br /&gt;
== Prototüüp ==&lt;br /&gt;
Prototüüp peab võimaldama kasutajal sisestada taski, siduda see ainega ja vajadusel grupiga ning lisada lubatud atribuudid. Lisatud taske kuvatakse detailvaates (selleks tuleb vajutada taski nimetusele).&lt;br /&gt;
Aplikatsiooni prototüüp .zip faili saab alla laadida siit[https://pilv.mana.ee/public.php?service=files&amp;amp;t=578d80969704c7be250b10406877ca74&amp;amp;path=%2FAVE&amp;amp;files=AVE_Application_proto20151211.zip&amp;amp;download]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi prototüübi funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Kasutaja saab sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja saab taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaja;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi;&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne.&lt;br /&gt;
* Kalendrivaates kuvatakse kuupäeva järgi sorteeritud taskid, kuid nende kuvamine etteantud vormidesse veel realiseerimisel - antud funktsionaalsus ei ole prototüübi jaoks vajalik;&lt;br /&gt;
* Vajutades taski nimetusele tehakse päring lokaalsesse baasi ning kuvatakse taski detailandmed (andmete muutmise funktsioon .DAL tasandil veel tealiseerimata).&lt;br /&gt;
* Rakendus töötab offline režiimis. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Andmebaas&#039;&#039;&#039;&lt;br /&gt;
- by default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri&#039;&#039;&#039; poolelt on realiseeritud API, mille kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Senine tööjaotus&#039;&#039;&#039;&lt;br /&gt;
* Kärt Palm - BLL (BO ja Service) ja praeguseks oluliselt muudetud DAL (esialgu realiseeritud DAL Entity frameworki&#039;l sai muudetud, et tagada SQlite tugi);&lt;br /&gt;
* Karina Egipt - View, ViewModel;&lt;br /&gt;
* Silver Saks - Lokaalne andmebaas, Server;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98324</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98324"/>
		<updated>2015-12-04T10:00:40Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
Kasutaja loomisel saadab server kasutaja sisestatud mailiaadressile kinnituskirja, kus kasutaja peab klikkima lingil, et oma kasutaja kinnitada. Antud lingi jaoks kasutatakse samuti stateless auth mustrit, serialiseeritud ja serveri poolt allkirjastatud andmed on URL-i parameeter.&lt;br /&gt;
&lt;br /&gt;
E-kirja saatmiseks kasutab server Mailgun teenust, kuna ise oma serverist kirju saates on äärmiselt suur tõenäosus, et need jäävad spämmifiltritesse kinni(SenderScore, jne).&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98315</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98315"/>
		<updated>2015-12-03T12:41:43Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Versioonikontroll */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98314</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98314"/>
		<updated>2015-12-03T12:40:39Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Versioonikontroll */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98313</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98313"/>
		<updated>2015-12-03T12:40:29Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Versioonikontroll */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
Versioonikontrolli käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga&lt;br /&gt;
 \packages&lt;br /&gt;
ja .nuget\NuGet.config fail sisuga:&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;configuration&amp;gt;&lt;br /&gt;
   &amp;lt;solution&amp;gt;&lt;br /&gt;
     &amp;lt;add key=&amp;quot;disableSourceControlIntegration&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;/solution&amp;gt;&lt;br /&gt;
 &amp;lt;/configuration&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98312</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98312"/>
		<updated>2015-12-03T12:34:42Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98301</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98301"/>
		<updated>2015-12-02T20:42:18Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Projekti kirjeldus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
[[File:Ave localdb.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=File:Ave_localdb.png&amp;diff=98300</id>
		<title>File:Ave localdb.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=File:Ave_localdb.png&amp;diff=98300"/>
		<updated>2015-12-02T20:41:33Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98270</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98270"/>
		<updated>2015-12-01T16:46:37Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
(SQLite andmebaasiskeem tuleb siia lisada)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98269</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98269"/>
		<updated>2015-12-01T15:30:19Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
(SQLite andmebaasiskeem tuleb siia lisada)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Server&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98268</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98268"/>
		<updated>2015-12-01T15:28:18Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
(SQLite andmebaasiskeem tuleb siia lisada)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98267</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98267"/>
		<updated>2015-12-01T15:27:06Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
(SQLite andmebaasiskeem tuleb siia lisada)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/ms995355.aspx Windows Data Protection API-t], mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
	<entry>
		<id>https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98266</id>
		<title>Meeskond: Spooky Scary Skeletons</title>
		<link rel="alternate" type="text/html" href="https://wiki.itcollege.ee/index.php?title=Meeskond:_Spooky_Scary_Skeletons&amp;diff=98266"/>
		<updated>2015-12-01T15:25:46Z</updated>

		<summary type="html">&lt;p&gt;Ssaks: /* Tehnoloogiad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Programmeerimine CSharp keeles (2015)]]&lt;br /&gt;
== Meeskond ja rollid ==&lt;br /&gt;
*&#039;&#039;&#039;Kärt Palm&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Karina Egipt&#039;&#039;&#039; - Projektijuht&lt;br /&gt;
*&#039;&#039;&#039;Erika Ehmann&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Silver Saks&#039;&#039;&#039; - Wiki pidaja&lt;br /&gt;
&lt;br /&gt;
== Idee ==&lt;br /&gt;
TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab &amp;quot;subscribeda&amp;quot; kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.&lt;br /&gt;
&lt;br /&gt;
== Analüüs ==&lt;br /&gt;
AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni. &lt;br /&gt;
&lt;br /&gt;
=== Mõisted ===&lt;br /&gt;
*&#039;&#039;&#039;Task&#039;&#039;&#039; - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task&#039;il saab olla vaid üks tähtaeg;&lt;br /&gt;
*&#039;&#039;&#039;Alamtask&#039;&#039;&#039;  - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;&lt;br /&gt;
*&#039;&#039;&#039;Atribuut&#039;&#039;&#039; - task&#039;i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);&lt;br /&gt;
*&#039;&#039;&#039;Õppeaine&#039;&#039;&#039; - Taske grupeeriv atribuut;&lt;br /&gt;
*&#039;&#039;&#039;Grupp&#039;&#039;&#039; - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;&lt;br /&gt;
*&#039;&#039;&#039;Subscribe&#039;&#039;&#039; - õppeainega, grupiga või task&#039;iga liitumine, mille tulemusena ilmub vastava aine/grupi task&#039;id kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
=== Rakenduse kirjeldus ===&lt;br /&gt;
Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).&lt;br /&gt;
&lt;br /&gt;
Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.&lt;br /&gt;
&lt;br /&gt;
Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole. &lt;br /&gt;
&lt;br /&gt;
Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe&#039;ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.&lt;br /&gt;
&lt;br /&gt;
Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on  kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.&lt;br /&gt;
&lt;br /&gt;
Rakendus koosneb kahest põhilisest osast: klient ja server.&lt;br /&gt;
&lt;br /&gt;
==== Klient ====&lt;br /&gt;
Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.&lt;br /&gt;
&lt;br /&gt;
Klient suhtleb serveriga üle REST API.&lt;br /&gt;
&lt;br /&gt;
Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.&lt;br /&gt;
&lt;br /&gt;
Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.&lt;br /&gt;
&lt;br /&gt;
Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.&lt;br /&gt;
&lt;br /&gt;
Task&#039;i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task&#039;i täitmise tähtaeg on lähenemas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);&lt;br /&gt;
*  Kasutaja peab saama sisse logida kasutajanime ja parooliga;&lt;br /&gt;
* Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;&lt;br /&gt;
* Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;&lt;br /&gt;
* Kasutaja peab saama taski kirjeldusena märkida:&lt;br /&gt;
** Task&#039;i täitmise tähtaega;&lt;br /&gt;
** Task&#039;i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;&lt;br /&gt;
** Taskiga seotud õppeaine ettantud nimekirjast;&lt;br /&gt;
** Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele&lt;br /&gt;
** soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;&lt;br /&gt;
** aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);&lt;br /&gt;
** kas task on alustamata, pooleli või lõpetatud (st taski staatust)&lt;br /&gt;
* Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kliendi nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
* Statistika tehtud ülesannete kohta.&lt;br /&gt;
* Kasutajakonto loomisel CAPTCHA kasutamine&lt;br /&gt;
* Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.&lt;br /&gt;
&lt;br /&gt;
Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task&#039;id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.&lt;br /&gt;
&lt;br /&gt;
Suhtlus kliendi ja serveri vahel toimub üle REST api.&lt;br /&gt;
&lt;br /&gt;
Andmebaasi skeem:&lt;br /&gt;
&lt;br /&gt;
[[File:Database AVE.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri must-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Peab võimaldama suhtlust kliendi ja andmebaasi vahel&lt;br /&gt;
* Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.&lt;br /&gt;
* Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.&lt;br /&gt;
* Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;&lt;br /&gt;
* Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;&lt;br /&gt;
* Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.&lt;br /&gt;
* API on kättesaadav ainult üle turvalise ühenduse&lt;br /&gt;
* Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Serveri nice-to-have funktsionaalsus:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* API rate limiting&lt;br /&gt;
* Bayesian spam filter&lt;br /&gt;
* Iga kasutaja kohta iCal faili automaatne koostamine.&lt;br /&gt;
* Push notifications&lt;br /&gt;
&lt;br /&gt;
== Projekti kirjeldus ==&lt;br /&gt;
=== Tehnoloogiad  ===&lt;br /&gt;
&#039;&#039;&#039;DAL - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://www.sqlite.org/ SQLite]&lt;br /&gt;
*[https://github.com/StackExchange/dapper-dot-net Dapper]&lt;br /&gt;
&lt;br /&gt;
Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.&lt;br /&gt;
&lt;br /&gt;
By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.&lt;br /&gt;
&lt;br /&gt;
(SQLite andmebaasiskeem tuleb siia lisada)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UI - Client&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.aspx WPF]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autentikatsioon - Client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese &amp;quot;jäta mind meelde&amp;quot;, ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame [https://msdn.microsoft.com/en-us/library/aa380261%28v=VS.85%29.aspx CryptProtectData] funktsiooni, mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039;&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx Task Parallel Library]&lt;br /&gt;
*[http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms731082%28v=vs.110%29.aspx WCF]&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/dd203052.aspx REST]&lt;br /&gt;
&lt;br /&gt;
Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.&lt;br /&gt;
&lt;br /&gt;
Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://&amp;lt;server&amp;gt;/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let&#039;s Encrypt tasuta teenust.&lt;br /&gt;
&lt;br /&gt;
Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.&lt;br /&gt;
&lt;br /&gt;
Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.&lt;br /&gt;
&lt;br /&gt;
Skeem on sarnane JSON Web Token skeemile ([https://tools.ietf.org/html/rfc7519 RFC 7519])&lt;br /&gt;
&lt;br /&gt;
=== Arendusmustrid  ===&lt;br /&gt;
*[http://social.technet.microsoft.com/wiki/contents/articles/13536.easy-mvvm-examples-in-extreme-detail.aspx MVVM][https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx]&lt;br /&gt;
&lt;br /&gt;
=== Versioonikontroll ===&lt;br /&gt;
*[https://msdn.microsoft.com/en-us/library/ms181237.aspx Team Foundation]&lt;br /&gt;
&lt;br /&gt;
=== API kirjeldus ja dokumentatsioon ===&lt;br /&gt;
*[https://apiblueprint.org/ Api Blueprint]&lt;br /&gt;
*[https://apiary.io/ Apiary]&lt;br /&gt;
*[https://github.com/apiaryio/dredd/ Dredd]&lt;br /&gt;
&lt;br /&gt;
Api kirjeldus asub aadressil [http://docs.ave.apiary.io/ http://docs.ave.apiary.io/]&lt;br /&gt;
WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.&lt;br /&gt;
&lt;br /&gt;
=== Koodi stiilireeglid ===&lt;br /&gt;
*[https://visualstudiogallery.msdn.microsoft.com/cac2a05b-6eb6-4fa2-95b9-1f8d011e6cae StyleCop]&lt;br /&gt;
Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed.&lt;br /&gt;
Muutujanimedel kasutame järgmiseid reegleid:&lt;br /&gt;
* Klassi privaatmuutujad algavad _ prefiksiga;&lt;br /&gt;
* Klassi avalikud meetodid ja muutujad algavad suurtähega;&lt;br /&gt;
* Kõik muud muutujad algavad väiketähega;&lt;br /&gt;
&lt;br /&gt;
Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.&lt;br /&gt;
&lt;br /&gt;
Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks &amp;quot;i&amp;quot; tsükliloendurina jne.&lt;br /&gt;
&lt;br /&gt;
Muutujanimed ei tohi sisaldada tüübiviidet.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Maagilised&amp;quot; muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.&lt;br /&gt;
&lt;br /&gt;
=== Litsents ===&lt;br /&gt;
Kogu rakendus avaldatakse GNU General Public License v3.0 all. [http://www.gnu.org/licenses/gpl-3.0.en.html (GPL)]&lt;br /&gt;
Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.&lt;br /&gt;
&lt;br /&gt;
== Avaldatud failid ==&lt;br /&gt;
[https://pilv.mana.ee/public.php?service=files&amp;amp;t=edaa0cf40fb840ba7a620d4c0252b49e Andmebaasi Skeem (DBDesigner) ]&lt;br /&gt;
&lt;br /&gt;
== Arendusprotsess ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;8.10.2015&#039;&#039;&#039; - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.&lt;br /&gt;
*&#039;&#039;&#039;19.10.2015&#039;&#039;&#039; - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.&lt;br /&gt;
*&#039;&#039;&#039;1.11.2015&#039;&#039;&#039; - Teine kohtumine. Valmis analüüs.&lt;br /&gt;
*&#039;&#039;&#039;6.11.2015&#039;&#039;&#039; - Lisatud retsensioon meeskonnale Premium.&lt;br /&gt;
*&#039;&#039;&#039;11.11.2015&#039;&#039;&#039; - Esimene tõmmis kasutajaliidesest TFS-is&lt;br /&gt;
*&#039;&#039;&#039;12.11.2015&#039;&#039;&#039; - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus&lt;br /&gt;
*&#039;&#039;&#039;15.11.2015&#039;&#039;&#039; - Loodud kliendi kohaliku andmebaasi skeem&lt;br /&gt;
*&#039;&#039;&#039;17.11.2015&#039;&#039;&#039; - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.&lt;br /&gt;
*&#039;&#039;&#039;21.11.2015&#039;&#039;&#039; - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.&lt;br /&gt;
*&#039;&#039;&#039;28.11.2015&#039;&#039;&#039; - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.&lt;br /&gt;
*&#039;&#039;&#039;30.11.2015&#039;&#039;&#039; - Rakendust esitletud C# praktikumis.&lt;br /&gt;
*&#039;&#039;&#039;31.11.2015&#039;&#039;&#039; - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.&lt;br /&gt;
&lt;br /&gt;
== Lisad ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=XTgFtxHhCQ0]&lt;/div&gt;</summary>
		<author><name>Ssaks</name></author>
	</entry>
</feed>