├── sprint2023.md ├── history.md ├── img ├── solo-code.JPG ├── team-code.JPG └── scrum-to-improvement.png ├── staging └── README.md ├── misc ├── ohtu-sopimus-v6.pdf └── ohtu-sopimus-v2-en.pdf ├── openshift ├── images │ ├── k1.png │ ├── k10.png │ ├── k12.png │ ├── k2.png │ ├── k3.png │ ├── k4.png │ ├── k5.png │ ├── k6.png │ ├── k8.png │ ├── k9.png │ ├── conf1.png │ └── conf2.png ├── old_kirjautuminen.md ├── OLD_README.md ├── django_openid.md ├── kirjautuminen.md └── README.md ├── sopimukset ├── sopimus-muut.pdf └── sopimus-yritys.pdf ├── history ├── summer2025.md ├── autumn2017.md ├── autumn2025.md ├── autumn2024.md ├── summer2017.md ├── summer2019.md ├── spring2025.md ├── autumn2020.md ├── summer2024.md ├── summer2020.md ├── autumn2023.md ├── summer2023.md ├── summer2018.md ├── autumn2021.md ├── spring2021.md ├── summer2021.md ├── spring2024.md ├── summer2022.md ├── spring2019.md ├── autumn2019.md ├── spring2023.md ├── autumn2022.md ├── spring2020.md ├── autumn2018.md ├── spring2018.md └── spring2022.md ├── tiimin_kaytanteet.md ├── demovideoita.md ├── roolit.md ├── LICENSE ├── itseisarvioinnin_kysymykset.md ├── best-practices.md ├── ohjeita-asiakaspalaveriin.md ├── learning-goals-of-software-engineering-lab.md ├── ohje-hyväksymiskriteerit.md └── README.md /sprint2023.md: -------------------------------------------------------------------------------- 1 | a 2 | -------------------------------------------------------------------------------- /history.md: -------------------------------------------------------------------------------- 1 | # Vanhat projektit 2 | 3 | [Täältä](history) löydät aiempien vuosien ryhmien repot, projektit, ym 4 | -------------------------------------------------------------------------------- /img/solo-code.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/img/solo-code.JPG -------------------------------------------------------------------------------- /img/team-code.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/img/team-code.JPG -------------------------------------------------------------------------------- /staging/README.md: -------------------------------------------------------------------------------- 1 | Moved to https://github.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/tree/master/openshift -------------------------------------------------------------------------------- /misc/ohtu-sopimus-v6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/misc/ohtu-sopimus-v6.pdf -------------------------------------------------------------------------------- /openshift/images/k1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k1.png -------------------------------------------------------------------------------- /openshift/images/k10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k10.png -------------------------------------------------------------------------------- /openshift/images/k12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k12.png -------------------------------------------------------------------------------- /openshift/images/k2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k2.png -------------------------------------------------------------------------------- /openshift/images/k3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k3.png -------------------------------------------------------------------------------- /openshift/images/k4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k4.png -------------------------------------------------------------------------------- /openshift/images/k5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k5.png -------------------------------------------------------------------------------- /openshift/images/k6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k6.png -------------------------------------------------------------------------------- /openshift/images/k8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k8.png -------------------------------------------------------------------------------- /openshift/images/k9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/k9.png -------------------------------------------------------------------------------- /misc/ohtu-sopimus-v2-en.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/misc/ohtu-sopimus-v2-en.pdf -------------------------------------------------------------------------------- /openshift/images/conf1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/conf1.png -------------------------------------------------------------------------------- /openshift/images/conf2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/openshift/images/conf2.png -------------------------------------------------------------------------------- /sopimukset/sopimus-muut.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/sopimukset/sopimus-muut.pdf -------------------------------------------------------------------------------- /img/scrum-to-improvement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/img/scrum-to-improvement.png -------------------------------------------------------------------------------- /sopimukset/sopimus-yritys.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/HEAD/sopimukset/sopimus-yritys.pdf -------------------------------------------------------------------------------- /history/summer2025.md: -------------------------------------------------------------------------------- 1 | # Kesän 2025 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [fossiili](https://github.com/nowcommunity/nowdatabase) 6 | - [condus](https://github.com/amazing-race-condus/amazing-race-app) 7 | - [OSRM](https://github.com/HY-OHTUPROJ-OSRM) 8 | - [Finlex](https://github.com/ohjelmistotuotantoprojekti/SEB-yhteensopiva_finlex-lukija) 9 | -------------------------------------------------------------------------------- /history/autumn2017.md: -------------------------------------------------------------------------------- 1 | ## Autumn 2017 long 2 | 3 | * [R Language Support for TMC](https://github.com/RTMC/tmc-r) 4 | * [TMC Plugin for Qt Creator](https://github.com/TestMyQt/Qt-CreatorTMC) 5 | * [Grappa 2.0](https://github.com/OhtuGrappa2/front-grappa2) 6 | * [Serverless Coaching Chatbot](https://github.com/kehitysto/coaching-chatbot) 7 | * [QR-Code Skannerz](https://bitbucket.org/luomus/skannerz) 8 | * [Olga Verkkokauppa](https://github.com/Team-Olga/Olga-Verkkokauppa) 9 | * [REMU](https://github.com/RemuTeam/Remu) 10 | -------------------------------------------------------------------------------- /tiimin_kaytanteet.md: -------------------------------------------------------------------------------- 1 | ### Mitkä on ryhmän sisäiset käytännöt? 2 | 3 | Käytännöt ovat yhteisiä sopimuksia. Sovitaan 0-sprintin aikana ja tarkennetaan projektin edetessä. 4 | 5 | Esimerkki 6 | - käytäntö: definition of done (on testit, on vertaisarvioitu, on tungettu repoon, kaikki toimii) 7 | - käytäntö: aikataulut (yhteisiä työpäiviä jolloin tiimi läsnä TKTL:llä, erityisesti planningit ym) 8 | - käytäntö: maksimimäärä asioita työn alla per henkilö 9 | - käytäntö: coding conventions, koodin laatu 10 | - käytäntö: palavereissa käyttäytyminen, kännyt kiinni, ei myöhässä paikalle 11 | -------------------------------------------------------------------------------- /demovideoita.md: -------------------------------------------------------------------------------- 1 | ## Muutamia demovideoita 2 | 3 | - [Pienryhmien optimointi, kesä 2023](https://www.youtube.com/watch?v=MJJqFB_mtdY) 4 | - [Improved tools for data scientists, kesä 2023](https://www.youtube.com/watch?v=Cn3LLCGRMLc) 5 | - [Weather based recommender, kesä 2023](https://www.youtube.com/watch?v=uWbicdil9OU) 6 | - [Superadmin, syksy 2022](https://www.youtube.com/watch?v=KxC5wu00eLY) 7 | - [Logomotion, syksy 2022](https://www.youtube.com/watch?v=468MQ3-3-qw) 8 | - [Farmasian VR-peli, kevät 2022](https://youtu.be/pQND6_6zA-k) 9 | - [Lintuasemasovellus, kevät 2021](https://youtu.be/Pvl-Dhjz0dk) 10 | -------------------------------------------------------------------------------- /history/autumn2025.md: -------------------------------------------------------------------------------- 1 | - [MuViCo](https://github.com/MuViCo/MuViCo) 2 | - [German Grammar Interactive Learning and Exercising Website](https://github.com/OHTU-German-learning-website/OHTU-German-learning-website) 3 | - [Infopiste](https://github.com/Infopisteprojekti/infopiste) 4 | - [Kahden chatbotin keskustelun automaatiotyökalu opetukselliseen roolipeliin](https://github.com/doubleAgent-ohtu/doubleAgent) 5 | - [DTwin](https://github.com/DTwin-HY/DTwin) 6 | - [Jakaja](https://github.com/piryopt/pienryhmien-optimointi) 7 | - [EcoPaths](https://github.com/OhtuProjektiSyksy25/EcoPaths) 8 | - [WalkAMile](https://github.com/WalkAMileGame/WalkAMileGame) 9 | -------------------------------------------------------------------------------- /history/autumn2024.md: -------------------------------------------------------------------------------- 1 | # Syksy 2024 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [Työturvallisuussovellus vaarojen tunnistamiseen työmaalla](https://github.com/Ohtu-Tyoturvallisuus/TTS-backend) 6 | - [MuViCo](https://github.com/MuViCo/MuViCo) 7 | - [Elisa eSport](https://github.com/NikiPOU/elisaohtuprojekti) 8 | - [Slow flower](https://github.com/Slowers-Team/Slowers-App) 9 | - [Human bias](https://github.com/top1-ohjelmistoprojektiryhma/HumanBiasProject) 10 | - [Farmasia VR](https://github.com/FarmasiaVR/farmasia-vr) 11 | - [Pyörävarkauksien estämisyhteisö](https://github.com/Bicyclesafe/bikesafe) 12 | - [fossiili](https://github.com/nowcommunity/nowdatabase) 13 | -------------------------------------------------------------------------------- /history/summer2017.md: -------------------------------------------------------------------------------- 1 | ## Summer 2017 first intensive period 2 | 3 | - [Clustering and Visualization Web Application for Speech](https://github.com/SSGL-SEP/speech_explorer) 4 | - [Xoliba AI](https://github.com/xoliba/xoliba) 5 | - [Adaptive exercises for NetBeans](https://github.com/sakuolin/skillifier) 6 | 7 | ## Summer 2017 long 8 | 9 | - [Biotalous Browser Game](https://github.com/tkt-biopeli/Biopeli) 10 | - [EKSY Mobile App](https://github.com/EksyApp/eksy) 11 | - [Interactive Web Repository for Physiological Computing](https://github.com/Mahtis/fysio2) 12 | - [MIK System](https://github.com/Owlaukka/MIK-System) 13 | 14 | ## Summer 2017 second intensive period 15 | 16 | - [Students Dashboard Widget](https://github.com/opiskelija-dashboard/dashboard) 17 | - [TDD Table Tennis](https://github.com/tdd-pingis/tdd-pingpong) 18 | -------------------------------------------------------------------------------- /history/summer2019.md: -------------------------------------------------------------------------------- 1 | 2 | ## Kesän 2019 ohjelmistotuotantoprojektit 3 | 4 | ### parhaat käytänteet 5 | 6 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 7 | 8 | ### Ryhmien repot 9 | - [Musiikin teorian MOOC-kurssijärjestelmä](https://github.com/rage/musiikin-teoria-material) 10 | - [Massage Booking System](https://github.com/karoliinaemilia/massage-booking-system) 11 | - [Bluetooth-positioning system for Ubikampus](https://github.com/ubikampus/Bluetooth-location-server) 12 | - [Emulator of data problems in use (and training) of machine learning systems](https://github.com/dpEmu/dpEmu) 13 | - Aikavälikertaus 14 | - [frontend](https://github.com/ohtu-aikavali2/aikavali2-front) 15 | - [backend](https://github.com/ohtu-aikavali2/aikavali2-back) 16 | 17 | ### Dokumentaatio 18 | 19 | ### Tuotantosovellukset 20 | -------------------------------------------------------------------------------- /history/spring2025.md: -------------------------------------------------------------------------------- 1 | # Kevään 2025 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [MuViCo](https://github.com/MuViCo/MuViCo) 6 | - [Slow flower](https://github.com/Slowers-Team/Slowers-App) 7 | - [Farmasia VR](https://github.com/FarmasiaVR/farmasia-vr) 8 | - [Elisa-ohtuprojekti](https://github.com/ohtuprojekti-Elisa) 9 | - [Library App for Eficode](https://github.com/tuulestatemmattu/libraryapp) 10 | - [Ruokavälitys (RV) management frontend](https://github.com/Ruokavalitys/rv-management-update-frontend) 11 | - [German Grammar Interactive Learning and Exercising Website](https://github.com/OHTU-German-learning-website/OHTU-German-learning-website) 12 | - [AI CTO](https://github.com/AI-CTO/AI-CTO) 13 | - [Megasense ERP](https://github.com/ohtu-megasense/erp) 14 | - [Future customer](https://github.com/ohtu-kohtalo/ohjelmistotuotantoprojekti) 15 | -------------------------------------------------------------------------------- /history/autumn2020.md: -------------------------------------------------------------------------------- 1 | ## Syksyn 2020 ohjelmistotuotantoprojektit 2 | 3 | ### parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Bakteerien tunnistuspeli](https://github.com/Ohtu-bakteerien-tunnistuspeli/Bakteerien-tunnistuspeli) 10 | - [Lintuasemasovellus](https://github.com/Lintuasemasovellus/lintuasemasovellus) 11 | - [Web editor & version control](https://github.com/ohtuprojekti-eficode/WEVC) 12 | - [Sukeltaja-App](https://github.com/Sukeltaja-Appi) 13 | - [Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl) 14 | 15 | ### Dokumentaatio 16 | [Bakteerien tunnistuspeli](https://github.com/Ohtu-bakteerien-tunnistuspeli/Bakteerien-tunnistuspeli/blob/master/README.md) 17 | 18 | ### Tuotantosovellukset 19 | [Bakteerien tunnistuspeli](https://bakteeripeli.it.helsinki.fi/kirjautuminen) 20 | -------------------------------------------------------------------------------- /history/summer2024.md: -------------------------------------------------------------------------------- 1 | # Kesä 2024 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [Food-Waste-Optimization](https://github.com/Food-Waste-Optimization/Food-Waste-Optimization) 6 | - [Ruokalaskuri](https://github.com/ohturuokasovellus/OhtuRuokasovellus) 7 | - [OSRM-reitityksen dynaaminen kulkueste](https://github.com/HY-OHTUPROJ-OSRM) 8 | - [Kurssiesitieto](https://github.com/Kurssiesitieto/kurssiesitieto-ohtuprojekti) 9 | - [Uutiskeräimen kontitus](https://github.com/uh-dcm/news-article-collection-container) 10 | 11 | ### Dokumentaatio 12 | - [Ruokalaskuri](https://github.com/ohturuokasovellus/OhtuRuokasovellus/tree/main/documentation) 13 | - [OSRM-reitityksen dynaaminen kulkueste](https://github.com/HY-OHTUPROJ-OSRM/osrm-project/wiki) 14 | - [Uutiskeräimen kontitus](https://github.com/uh-dcm/news-article-collection-container/tree/main/docs) 15 | 16 | ### Tuotantosovellukset 17 | - [Ruokalaskuri](https://ruokalaskuri.fi) 18 | - [Kurssiesitieto](https://study.cs.helsinki.fi/esitieto/) 19 | -------------------------------------------------------------------------------- /roolit.md: -------------------------------------------------------------------------------- 1 | # Roolit ohtuprojektissa 2 | 3 | ## Asiakas 4 | 5 | - Asiakas sopii ryhmän kanssa ensimmäisessä tapaamisessa työn laajuudesta ja vastaa ryhmän kysymyksiin. Luodaan Product Backlog. 6 | - Joka iteraation jälkeen pitäisi olla jotain demottavaa asiakkaalle 7 | - Asiakas on läsnä sprintin lopuksi pidettävässä demossa ja antaa palautetta / uusia / tarkennettuja itemejä Product Backlogiin. 8 | - Asiakas kertoo toiveistaan/vaatimuksistaan ja määrittää niille tärkeysjärjestyksen, jonka tulee heijastua product backlogissa 9 | 10 | Asiakkaan rooliin EI kuulu: 11 | - Ryhmän työhön sotkeutuminen (esim. työn alla olevien vaatimuksien muuttaminen) kesken sprintin 12 | - Muissa palavereissa kuin sprintinjälkeisessä review/demopalaverissa läsnäolo 13 | - tarkemman sprint planningin hoitaa yheensä RYHMÄ asiakkaan toiveet mielessä pitäen ja asiakkaan läsnäoloa ei edellytetä, tarpeen mukaan asiakaskin toki voi olla paikalle 14 | - Product backlogin ylläpito. Tiimi vastaa asiakkaan toiveiden kirjaamisesta backlogille. 15 | -------------------------------------------------------------------------------- /history/summer2020.md: -------------------------------------------------------------------------------- 1 | ## Kesän 2020 ohjelmistotuotantoprojektit 2 | 3 | ### parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [HYSQL - opetuskieli tietokantakursseille](https://github.com/hy-sql/project-info) 10 | - [Tools for automated image analysis in social sciences](https://github.com/duck-duck-tag/duck-duck-tag) 11 | - [Remote Society Now - etätyön hyötyjen mittaaminen työntekijä- ja yritysdatalla](https://github.com/RemoteSocietyNow-ohtu/remotesocietynow) 12 | - [Robotin konenäkö mikropalveluna](https://github.com/Konenako/Ohtuprojekti-kesa2020) 13 | - C# and Bash Support for TMC 14 | - [C# Support for TMC](https://github.com/TMC-CSharp/tmc-csharp) 15 | - [Bash Support for TMC](https://github.com/tmc-bash/tmc-bash) 16 | 17 | ### Dokumentaatio 18 | - C# and Bash Support for TMC 19 | - [C# Support for TMC](https://github.com/TMC-CSharp/tmc-csharp) 20 | - [Bash Support for TMC](https://github.com/tmc-bash/tmc-bash) 21 | 22 | ### Tuotantosovellukset 23 | - C# support for TMC 24 | - [TestMyCode](https://tmc.mooc.fi/) 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /history/autumn2023.md: -------------------------------------------------------------------------------- 1 | # Syksy 2023 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [Robottikoodieditori](https://github.com/robottikoodieditori) 6 | - [Training Hub](https://github.com/ohtutraininghub/traininghub) 7 | - [Ilmastokompassi](https://github.com/Ilmastokompassi/Ilmastokompassi) 8 | - [ILMOWEB](https://github.com/ILMOWEB/ilmo) 9 | - [SAT-STEP](https://github.com/SAT-STEP/SAT-STEP) 10 | - [Kirjoittamisen itsearviointityökalu](https://github.com/ohturyhma123/tieki-app) 11 | 12 | ### Dokumentaatio 13 | 14 | - [Robottikoodieditori](https://github.com/robottikoodieditori) 15 | - [Training Hub](https://github.com/ohtutraininghub/traininghub) 16 | - [Ilmastokompassi](https://github.com/Ilmastokompassi/Ilmastokompassi/tree/main/docs) 17 | - [ILMOWEB](https://github.com/ILMOWEB/ilmo/tree/main/documentation) 18 | - [SAT-STEP](https://github.com/SAT-STEP/SAT-STEP) 19 | 20 | ### Tuotantosovellukset 21 | 22 | - [Robottikoodieditori](https://github.com/robottikoodieditori) 23 | - [Training Hub](https://github.com/ohtutraininghub/traininghub) 24 | - [ILMOWEB](https://github.com/ILMOWEB/ilmo) 25 | - [Ilmastokompassi](https://ilmastokompassi.helsinki.fi) 26 | -------------------------------------------------------------------------------- /history/summer2023.md: -------------------------------------------------------------------------------- 1 | # Kesä 2023 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [Urheiluseura 3.0](https://github.com/Urheiluseura-3-0) 6 | - [Tiny Machine Learning as a Service](https://github.com/orgs/TinyMLaas/repositories) 7 | - [Improved tools for data scientists](https://github.com/Order-Team/bring-order) 8 | - [Weather-based recommendation for outdoor activities in Helsinki](https://github.com/HelsinkiUniCollab/WeatherbasedRecommender) 9 | - [MammalBase](https://github.com/karilint/mammalbase) 10 | - [Pienryhmien Optimointi](https://github.com/piryopt/pienryhmien-optimointi) 11 | 12 | ### Dokumentaatio 13 | 14 | - [Tiny Machine Learning as a Service](https://github.com/TinyMLaas/TinyMLaaS/tree/main/docs) 15 | - [Staging API docs](https://tiny.marenk.fi/api/docs) 16 | - [MammalBase](https://github.com/karilint/mammalbase/tree/main/documentation) 17 | - [Pienryhmien Optimointi](https://github.com/piryopt/pienryhmien-optimointi/tree/main/documentation) 18 | 19 | ### Tuotantosovellukset 20 | 21 | - [Tiny Machine Learning as a Service](https://tiny.marenk.fi/) 22 | - [API](https://tiny.marenk.fi/api/) 23 | - [MammalBase](https://staging.mammalbase.net/) 24 | - [Pienryhmien Optimointi](https://piryopt.ext.ocp-test-0.k8s.it.helsinki.fi/) 25 | -------------------------------------------------------------------------------- /history/summer2018.md: -------------------------------------------------------------------------------- 1 | 2 | ## Kesän 2018 ohjelmistotuotantoprojektit 3 | 4 | ### parhaat käytänteet 5 | 6 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 7 | 8 | ### Ryhmien repot 9 | - [Labtool](https://github.com/labtool/labtool) 10 | - Kurssikartta 11 | - [front](https://github.com/kurssikartta-ohtuprojekti/kurssikartta-front) 12 | - [back](https://github.com/kurssikartta-ohtuprojekti/kurssikartta-back) 13 | - [Luupeli](https://github.com/luupeli/luupeli) 14 | 15 | ### Dokumentaatio 16 | - Labtool 17 | - [backlog](https://github.com/labtool/labtool/projects/1) 18 | - [muu dokumentaatio](https://drive.google.com/drive/folders/1CkmhZ3rhVPO3Qn_hrFSlWlRKFN-sV-Lw) 19 | - Kurssikartta 20 | - [backlog](https://docs.google.com/spreadsheets/d/1PXgQVgB_MMsUWzie6D0eFcQnCfmKfAFmBePvULNeHoE) 21 | - Luupeli 22 | - [backlog](https://docs.google.com/spreadsheets/d/1b66WPYF05FefrFPH069sPz5Ew2VdkUd1fpNZGQjryEQ/edit?usp=sharing) 23 | - [muu dokumentaatio](https://github.com/luupeli/luupeli/wiki) 24 | 25 | ### Tuotantosovellukset 26 | - Labtool 27 | - [staging](https://svm-61.cs.helsinki.fi/labtool/) toimii vain laitoksen verkossa 28 | - [tuotanto](https://studies.cs.helsinki.fi/labtool/) 29 | - Kurssikartta 30 | - [Kurssikartta](https://kurssikartta.herokuapp.com/) 31 | - Luupeli 32 | - [tuotanto](http://luupeli.herokuapp.com/) 33 | -------------------------------------------------------------------------------- /history/autumn2021.md: -------------------------------------------------------------------------------- 1 | ## Syksyn 2021 ohjelmistotuotantoprojektit 2 | 3 | ### Parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/blob/master/best-practices.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Amandus](https://github.com/Ohtu-project-Eficode/Amandus) 10 | - [Discord kurssibotti](https://github.com/Ohtuproju2021syksy/Discord-Bot-better) 11 | - [Kierratysavustin](https://github.com/ohtuprojekti-Kierratysavustin/Kierratysavustin) 12 | - [Mielentilatutkimus-thl](https://github.com/ohtuprojekti-mielentilatutkimus-thl/mielentilatutkimus-thl) 13 | - [RNames](https://github.com/karilint/rnames) 14 | - [Taudinpurkauspeli2021](https://github.com/taudinpurkauspeli/taudinpurkauspeli2021) 15 | - [Lintu- ja kasviatlas](https://github.com/ATLAS-ohtuprojekti/ATLAS) 16 | - [Hybridityöskentelyn tukisovellus Slack-integraatiolla](https://github.com/hytuslain/hytuslain) 17 | 18 | ### Dokumentaatio 19 | 20 | - [Discord kurssibotti](https://github.com/Ohtuproju2021syksy/Discord-Bot-better/blob/main/README.md) 21 | - [Kierratysavustin](https://github.com/ohtuprojekti-Kierratysavustin/Kierratysavustin/blob/main/README.md) 22 | - [RNames](https://github.com/sallamarieini/ohtu-project-RNames) 23 | - [Taudinpurkauspeli](https://wiki.helsinki.fi/display/TAUPE/2021+Taudinpurkauspeli) 24 | 25 | ### Tuotantosovellukset 26 | - [Amandus](http://135.181.89.96:4000/) 27 | - [Kierratysavustin](https://kierratysavustin.cs.helsinki.fi/) 28 | -------------------------------------------------------------------------------- /history/spring2021.md: -------------------------------------------------------------------------------- 1 | ## Kevään 2021 ohjelmistotuotantoprojektit 2 | 3 | ### parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Lintuasemasovellus](https://github.com/luomus/lintuasemasovellus) 10 | - [DevOps itsearviointikysely](https://github.com/Devops-ohtuprojekti/DevOpsCSAOS) 11 | - [Adminapp Medified](https://github.com/ohtuprojekti-medified/adminapp-medified) 12 | - [Kierrätysavustin](https://github.com/ohtuprojekti-Kierratysavustin/Kierratysavustin) 13 | - [Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl) 14 | 15 | 16 | ### Dokumentaatio 17 | 18 | - [Lintuasemasovellus](https://github.com/luomus/lintuasemasovellus/blob/master/README.md) 19 | - [DevOps itsearviointikysely](https://github.com/Devops-ohtuprojekti/DevOpsCSAOS/blob/main/documentation/) 20 | - [Adminapp Medified](https://github.com/ohtuprojekti-medified/adminapp-medified/blob/master/README.md) 21 | - [Kierrätysavustin](https://github.com/ohtuprojekti-Kierratysavustin/Kierratysavustin/tree/main/documents) 22 | - [Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl/tree/master/documentation) 23 | - [ETIE](https://github.com/IELuomus/extractiontool/blob/main/README.md) 24 | 25 | 26 | ### Tuotantosovellukset 27 | 28 | - [DevOps itsearviointikysely](https://ohtu-csaos-staging.herokuapp.com/) 29 | - Adminapp Medified - tulossa 30 | - [Projektiryhmäytymistyökalu](https://study.cs.helsinki.fi/assembler) 31 | -------------------------------------------------------------------------------- /history/summer2021.md: -------------------------------------------------------------------------------- 1 | ## Kesä 2021 ohjelmistotuotantoprojektit 2 | 3 | ### parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [CSES-järjestelmän komentorivityökalu](https://github.com/csesfi/cses-cli) 10 | - [Kristillisten sinkkujen deitti](https://github.com/Ohtu-KSDeitti/frontend_ksd) 11 | - [LUMA-tiedeluokkien varausjärjestelmä](https://github.com/lumawelhot/luma-varaukset) 12 | - [QuantMark](https://github.com/quantum-ohtu) 13 | - [Discord kurssibotti](https://github.com/CS-DISCORD-BOT/cs-discord-bot) 14 | - [Mobiili-lähiruokasovellus](https://github.com/ohtu2021satoja/SatojaREKO) 15 | - [ChatbotTrolli](https://github.com/sumuh/Trollbot) 16 | 17 | ### Dokumentaatio 18 | 19 | - [CSES-järjestelmän komentorivityökalu](https://github.com/csesfi/cses-cli/blob/main/README.md) 20 | - [Kristillisten sinkkujen deitti](https://github.com/Ohtu-KSDeitti/frontend_ksd/blob/main/README.md) 21 | - [LUMA-tiedeluokkien varausjärjestelmä](https://github.com/lumawelhot/luma-varaukset/blob/main/README.md) 22 | - [QuantMark](https://github.com/quantum-ohtu/QuantMark/wiki) 23 | - [Discord kurssibotti](https://github.com/CS-DISCORD-BOT/project-info) 24 | - [Mobiili-lähiruokasovellus](https://github.com/ohtu2021satoja/SatojaREKO/blob/main/documents/databasedia.png) 25 | 26 | ### Tuotantosovellukset 27 | 28 | - [CSES-järjestelmän komentorivityökalu](https://github.com/csesfi/cses-cli/releases) 29 | - [LUMA-tiedeluokkien varausjärjestelmä](https://ohtup-staging.cs.helsinki.fi/luma-varaukset) 30 | -------------------------------------------------------------------------------- /openshift/old_kirjautuminen.md: -------------------------------------------------------------------------------- 1 | # Yliopiston kirjautuminen 2 | 3 | Jos projekti vaatii yliopiston kirjautumista vaihtoehdot ovat käytännössä SAML-pohjainen Shibboleth kirjautuminen tai modernimpaan OAuth:iin ja OpenID Connect:iin (OIDC) perustuva ratkaisu. 4 | 5 | ## OpenID Connect 6 | 7 | ks [kirjautuminen.md](kirjautuminen.md) 8 | 9 | 10 | ## Shibboleth 11 | 12 | - [Yliopiston Shibboleth ohjeet](https://wiki.helsinki.fi/xwiki/bin/view/IAMasioita/Identiteetin-%20ja%20p%C3%A4%C3%A4synhallinnan%20dokumentaatio/Keskitetyn%20k%C3%A4ytt%C3%A4j%C3%A4tunnistuksen%20vaihtoehdot/1.%20Shibboleth%20%28SAML2%20%20OIDC%29/Ohjeet%20Shibbolointiin) 13 | - [Konttialustan Shibboleth ohjeet](https://wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehitt%C3%A4j%C3%A4n%20ohjeet/Alustat/Tiken%20konttialusta/3%20-%20Ohjeet/Shibboleth-kirjautuminen%20sovelluksellesi) 14 | 15 | Shibboleth-kirjautumiseen on mahdollista käyttää valmiiksi OpenShift:iin konfiguroitua instanssia. Riittää, että sovelluksen lisää tähän [Apache-konfiguraatiotiedostoon](https://console-openshift-console.apps.ocp-test-0.k8s.it.helsinki.fi/k8s/ns/ohtuprojekti-staging/configmaps/httpd-config) ja uudelleenkäynnistää Shibbolethin. Tämän jälkeen sovellukseen voi tunnistautua osoitteessa [shibboleth.ext.ocp-test-0.k8s.it.helsinki.fi/osoite](https://shibboleth.ext.ocp-test-0.k8s.it.helsinki.fi/sovellus/). Sovellus sää käyttäjän atribuutit pyyntöjen headereissa. 16 | 17 | Esimerkkitoteutus ks. [shibboleth-postgres-example](https://github.com/UniversityOfHelsinkiCS/shibboleth-postgres-example/blob/main/src/server/middleware/user.ts). 18 | -------------------------------------------------------------------------------- /history/spring2024.md: -------------------------------------------------------------------------------- 1 | # Kevät 2024 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [MammalBase](https://github.com/karilint/mammalbase) 6 | - [Klusteri website](https://github.com/matlury/klusteri-website) 7 | - [game-ai-platform-team](https://github.com/game-ai-platform-team/tira-ai-platform) 8 | - [Kurssi-Esitieto](https://github.com/Kurssiesitieto/kurssiesitieto-ohtuprojekti) 9 | - [Kitsain](https://github.com/ohtuprojektiryhma/kitsain) 10 | - [MTK-logistics-optimization](https://github.com/MTK-ohtu/mtk-ohtu) 11 | - [Palkkatietopalvelu](https://github.com/Palkkatietopalvelu/palkkatietopalvelu) 12 | - [Training Hub](https://github.com/ohtutraininghub/traininghub) 13 | - [Ohtuprojektin Ilmoittautumissovellus](https://github.com/Ohtuilmo/ohtuilmo) 14 | 15 | ### Dokumentaatio 16 | 17 | - [MammalBase](https://github.com/karilint/mammalbase/tree/main/documentation) 18 | - [Klusteri website](https://github.com/matlury/klusteri-website) 19 | - [game-ai-platform-team](https://github.com/game-ai-platform-team/tira-ai-platform/tree/main/docs) 20 | - [Kurssi-Esitieto](https://github.com/Kurssiesitieto/kurssiesitieto-ohtuprojekti/tree/main/documentation) 21 | - [Kitsain](https://github.com/ohtuprojektiryhma/kitsain/tree/main/documentation) 22 | - [MTK-logistics-optimization](https://github.com/MTK-ohtu/mtk-ohtu/tree/main/docs) 23 | - [Palkkatietopalvelu](https://github.com/Palkkatietopalvelu/palkkatietopalvelu/tree/main/documents) 24 | - [Training Hub](https://github.com/ohtutraininghub/traininghub/tree/main/docs) 25 | 26 | ### Tuotantosovellukset 27 | 28 | - [MammalBase](https://staging.mammalbase.net/) 29 | - [game-ai-platform-team](PLACEHOLDER) 30 | - [Kitsain](PLACEHOLDER) 31 | -------------------------------------------------------------------------------- /history/summer2022.md: -------------------------------------------------------------------------------- 1 | # Kesä 2022 ohjelmistotuotantoprojektit 2 | 3 | ### Ryhmien repot 4 | 5 | - [Lintuasemasovelluksen jatkokehitys](https://github.com/luomus/lintuasemasovellus) 6 | - [Robot mapper with ROS2 and Turtlebot3](https://github.com/Le36/ros2-mapper) 7 | - [MammalBase](https://github.com/karilint/mammalbase) 8 | - [Helsinki Genomic Graph Database](https://github.com/Helsinki-Genomic-Graph-Database/HGGD) 9 | - [Pharmacy VR Game Part 3](https://github.com/tjvalkonen/farmasia-vr) 10 | - [Robot Logo Compiler](https://github.com/Robot-Logo-Compiler/Robot-Logo-Compiler) 11 | 12 | ### Dokumentaatio 13 | 14 | - [Lintuasemasovelluksen jatkokehitys](https://github.com/luomus/lintuasemasovellus/tree/master/documentation) 15 | - [Robot mapper with ROS2 and Turtlebot3](https://github.com/Le36/ros2-mapper/blob/main/documentation/tutorials.md) 16 | - [MammalBase](https://github.com/karilint/mammalbase/tree/main/documentation) 17 | - [Helsinki Genomic Graph Database](https://github.com/Helsinki-Genomic-Graph-Database/HGGD/tree/main/documentation) 18 | - [Pharmacy VR Game Part 3](https://github.com/tjvalkonen/farmasia-vr/tree/dev/Docs) 19 | - [Robot Logo Compiler](https://github.com/Robot-Logo-Compiler/Robot-Logo-Compiler/blob/main/Documentation/instructions.MD) 20 | 21 | 22 | ### Tuotantosovellukset 23 | 24 | - [Lintuasemasovelluksen jatkokehitys](http://lintuasema-lintuasema-staging.rahtiapp.fi/) 25 | - [Robot mapper with ROS2 and Turtlebot3](https://github.com/Le36/ros2-mapper/tree/main/workspace) 26 | - [MammalBase](https://staging.mammalbase.net/) 27 | - [Helsinki Genomic Graph Database](https://hggd.cs.helsinki.fi/hggd/index) 28 | - [Pharmacy VR Game Part 3](https://github.com/tjvalkonen/farmasia-vr) 29 | -------------------------------------------------------------------------------- /history/spring2019.md: -------------------------------------------------------------------------------- 1 | ## Kevään 2019 ohjelmistotuotantoprojektit 2 | 3 | ### Parhaat käytänteet 4 | 5 | Ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - Partio 10 | - [Frontend](https://github.com/partio-scout/tosu-frontend) 11 | - [Backend](https://github.com/partio-scout/tosu-backend-node) 12 | - [Ohtuprojekti-ilmo](https://github.com/ohtuprojekti-ilmo) 13 | - [Kisallioppiminen.fi](https://github.com/Matikkaprojekti) 14 | - [TKT-ohjaajarekisteri](https://github.com/TKT-ohjaajarekisteri) 15 | - Fluxx Chat 16 | - [Frontend](https://github.com/FluxxChat/FluxxChat-webasiakas) 17 | - [Backend](https://github.com/FluxxChat/FluxxChat-palvelin) 18 | 19 | ### Dokumentaatio 20 | 21 | - Partio 22 | - Ohtuprojekti-ilmo 23 | - [Backlog](https://docs.google.com/spreadsheets/d/1205Vjsr9tYh99stufyOv2tWTvFBVQ1rwzXtABFH2EsI/edit?usp=sharing) 24 | - [Tuntikirjanpito](https://docs.google.com/spreadsheets/d/1uagIAAlsbgqUgsZ5_jsUPeGgxEzarq86cyLeBCV282E/edit?usp=sharing) 25 | - [Kisallioppiminen.fi](https://docs.google.com/spreadsheets/d/e/2PACX-1vRPtzcQTtghurkIFXZ38BT5HgzWY6mAbIIx0y8FKe3SPWxwXvilJqsDdFW4aE9DMEN7EuQZhJhZ7NPl/pubhtml) 26 | - [TKT-ohjaajarekisteri](https://github.com/TKT-ohjaajarekisteri/TKT-ohjaajarekisteri-front/tree/master/documentation) 27 | - [Fluxx Chat](https://github.com/FluxxChat/FluxxChat-dokumentaatio) 28 | 29 | ### Sovellukset 30 | 31 | - Partio 32 | - Ohtuprojekti-ilmo 33 | - [sovellus](https://studies.cs.helsinki.fi/projekti/) 34 | - Kisallioppiminen.fi 35 | - [staging](https://matikkaprojekti.github.io/kisallioppiminen-staging/) 36 | - [TKT-ohjaajarekisteri](https://tkt-ohjaajarekisteri-front.herokuapp.com/) 37 | - [Fluxx Chat](https://fluxxchat-webasiakas.herokuapp.com/) 38 | -------------------------------------------------------------------------------- /history/autumn2019.md: -------------------------------------------------------------------------------- 1 | ## Syksyn 2019 ohjelmistotuotantoprojektit 2 | 3 | ### parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Hintahaukka](https://github.com/Hintahaukka) 10 | - [Mobiilishakki](https://github.com/Mobiilishakki/Mobiilishakki) 11 | - [VR-peli](https://github.com/ohtuprojekti-farmasia/farmasia-vr) 12 | - [Monihakusovellus](https://github.com/Ohtu-FaceTed) 13 | - [Saavutettava somepalvelu](https://github.com/kohdataan) 14 | - Data Structures and Algorithms Project templates 15 | - [Chess](https://github.com/TiraLabra/chess) 16 | - [Minesweeper](https://github.com/TiraLabra/minesweeper) 17 | - [Labtool-2019](https://github.com/UniversityOfHelsinkiCS/labtool) 18 | 19 | ### Dokumentaatio 20 | 21 | - Hintahaukka 22 | - [backlog](https://docs.google.com/spreadsheets/d/1Mazq4EFbfbMsLPeCpOckbu11LNR1Ki2RiNf460z-rpU/edit#gid=517998298) 23 | - Mobiilishakki 24 | - [backlog](https://docs.google.com/spreadsheets/d/1zG-0s1h2mIXxn2nuR7uvuNg6FT7avz7rtKZj1EuxpaE/edit#gid=1) 25 | - VR-peli 26 | - [Product backlog](https://github.com/ohtuprojekti-farmasia/farmasia-vr/projects/1) 27 | - Monihakusovellus 28 | - [backlog](https://github.com/Ohtu-FaceTed/FaceTed-Search/projects) 29 | - Saavutettava somepalvelu 30 | - [backlog](https://github.com/orgs/kohdataan/projects/2) 31 | - Data Structres and Algorithms Project Templates 32 | - [backlog[(https://helsinkifi-my.sharepoint.com/:x:/g/personal/jermusto_ad_helsinki_fi/EbSHuSez9tVNi0CxTRtVU_sBo6SEdoqiayo5-I-wRxh_XA?e=TAZVRq) 33 | - Labtool-2019 34 | - [backlog](https://github.com/UniversityOfHelsinkiCS/labtool/projects/3) 35 | 36 | 37 | ### Tuotantosovellukset 38 | - Labtool-2019 39 | - [sovellus](https://study.cs.helsinki.fi/labtool) 40 | -------------------------------------------------------------------------------- /history/spring2023.md: -------------------------------------------------------------------------------- 1 | ## Kevään 2023 ohjelmistotuotantoprojektit 2 | 3 | ### Parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/blob/master/best-practices.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Anturidatan_visualisointi](https://github.com/Anturit/Anturidatan_visualisointi) 10 | - [Berry Picker Tracker](https://github.com/marjanpoimijat) 11 | - [Cast2023](https://github.com/Cast2023/cast) 12 | - [FarmasiaVR](https://github.com/FarmasiaVR/farmasia-vr) 13 | - [Koululentovaraukset](https://github.com/Ohtuprojekti-Fintraffic/lentovaraukset) 14 | - [Movie-Book Recommender](https://github.com/movie-book-recommender/movie-book-recommender-project) 15 | - [Origami-TinyML](https://github.com/Origami-TinyML/tflm_hello_world) 16 | - [Revita](https://github.com/UniversityOfHelsinkiCS/mobvita) 17 | - [TMC-Coach](https://github.com/tmc-coach/tmc-coach) 18 | 19 | ### Dokumentaatio 20 | 21 | - [Anturidatan_visualisointi](https://github.com/Anturit/Anturidatan_visualisointi/tree/main/documentation) 22 | - [Berry Picker Tracker](https://github.com/marjanpoimijat/berry-picker-tracker-docs) 23 | - [Cast2023](https://github.com/Cast2023/cast/tree/master/documentation) 24 | - [FarmasiaVR](https://github.com/FarmasiaVR/farmasia-vr/tree/dev/Docs) 25 | - [Koululentovaraukset](https://github.com/Ohtuprojekti-Fintraffic/lentovaraukset/wiki) 26 | - [TMC-Coach](https://github.com/tmc-coach/tmc-coach/tree/main/documentation) 27 | - [Movie-Book Recommender](https://github.com/movie-book-recommender/movie-book-recommender-project/tree/main/Documentation) 28 | 29 | ### Tuotantosovellukset 30 | 31 | - [Cast2023](https://cast23.lol) 32 | - [Koululentovaraukset](https://ohtup-staging.cs.helsinki.fi/lentovaraukset/) 33 | - [Revita](https://revita.cs.helsinki.fi) 34 | - [Movie-Book Recommender](http://128.214.253.51:5000/) 35 | -------------------------------------------------------------------------------- /history/autumn2022.md: -------------------------------------------------------------------------------- 1 | ## Syksyn 2022 ohjelmistotuotantoprojektit 2 | 3 | ### Parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/blob/master/best-practices.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Berrry picker tracker](https://github.com/hy-ohtu-syksy-22-bpt/) 10 | - [Vesialueen inventointi-ilmoitus](https://github.com/ohtuprojekti-2022) 11 | - [Admin application for existing Online Questionnaire tool](https://github.com/QueryAdmin-ohtu/SuperAdmin3000) 12 | - [Kokoushuoneiden varaaminen](https://github.com/ohtuprojekti-kokoushuone/kokoushuoneiden-varaaminen) 13 | - [Logomotion](https://github.com/logo-to-lego/logomotion) 14 | - [Transpilation methods for quantum computers](https://github.com/Helsinki-Qubits/Ohtu-A2022-Transpilation_methods_for_quantum_computers) 15 | - [RDM Intro platform](https://version.helsinki.fi/rdmintro/rdmintro) 16 | 17 | ### Dokumentaatio 18 | 19 | - [Berrry picker tracker](https://github.com/hy-ohtu-syksy-22-bpt/berry-picker-tracker-docs) 20 | - [Vesialueen inventointi-ilmoitus](https://github.com/ohtuprojekti-2022/vesialueen-inventointi-ilmoitus) 21 | - [Admin application for existing Online Questionnaire tool](https://github.com/QueryAdmin-ohtu/SuperAdmin3000) 22 | - [Kokoushuoneiden varaaminen](https://github.com/ohtuprojekti-kokoushuone/kokoushuoneiden-varaaminen/tree/main/documentation) 23 | - [Logomotion](https://github.com/logo-to-lego/logomotion/tree/main/documentation) 24 | - [RDM Intro platform](https://version.helsinki.fi/rdmintro/rdmintro) 25 | 26 | ### Tuotantosovellukset 27 | 28 | - [Berry picker tracker](https://berry-picker-tracker.cs.helsinki.fi) 29 | - [Vesialueen inventointi-ilmoitus](https://vesialue-front.herokuapp.com/) 30 | - [Admin application for existing Online Questionnaire tool](https://superadmin3000.herokuapp.com) 31 | - [Kokoushuoneiden varaaminen](https://reservator.ubikampus.net) 32 | - [RDM Intro platform](https://rdmintro.helsinki.fi/) 33 | -------------------------------------------------------------------------------- /history/spring2020.md: -------------------------------------------------------------------------------- 1 | ## Kevään 2020 ohjelmistotuotantoprojektit 2 | 3 | ### parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [Graafinen funktionaalinen ohjelmointikieli](https://github.com/funktionaalinen-graafinen-kieli) 10 | - [Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl) 11 | - [Kisatehtäväpankki](https://github.com/Partioprojekti/kisatehtavapankki) 12 | - [Lunch Application](https://github.com/team-lunch-app/lunch-app) 13 | - [Maastokartoitus sovellus](https://github.com/Maastokartoitusryhma/maastokartoitus-app) 14 | - [RPA Dashboard](https://github.com/Robo-Project) 15 | - [Suorituspolut-sovellus](https://github.com/suorituspolut/Suorituspolut) 16 | - [VSCode TMC-liitännäinen](https://github.com/rage/tmc-vscode) 17 | 18 | ### Backlogit 19 | 20 | - [Graafinen funktionaalinen ohjelmointikieli](https://github.com/funktionaalinen-graafinen-kieli/backlogs/projects) 21 | - [Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl) 22 | - [Kisatehtäväpankki](https://github.com/Partioprojekti/kisatehtavapankki) 23 | - [Lunch Application](https://docs.google.com/spreadsheets/d/1M-zd3dfMU6X8cAQRekaUWfHNRmXgxpYUZim4LKkOV8Q/edit?usp=sharing) 24 | - [Maastokartoitus sovellus](https://docs.google.com/spreadsheets/d/1m7VQjWEWSzhMSs83YdCRn0AIC5W5rsfShjiJ0MSNvu4/edit?usp=drivesdk) 25 | - [Suorituspolut-sovellus](https://docs.google.com/spreadsheets/d/10I3woz3KTBmCiSt_vDrgeIdjG_VAujJe4kMJsc5h_64/edit#gid=2097623665) 26 | - [VSCode TMC-liitännäinen](https://github.com/rage/tmc-vscode/projects/1) 27 | 28 | ### Backlogit 29 | 30 | - Projektiryhmäytymistyökalu: https://github.com/UniversityOfHelsinkiCS/prkl/projects/ 31 | 32 | ### Tuotantosovellukset 33 | 34 | - [Graafinen funktionaalinen ohjelmointikieli](http://funkly.herokuapp.com/) 35 | - [Projektiryhmäytymistyökalu](https://toska.cs.helsinki.fi/assembler/) 36 | - [Lunch Application](https://lunch-application.herokuapp.com/) 37 | - [Suorituspolut-sovellus](https://toska.cs.helsinki.fi/suorituspolut/) 38 | -------------------------------------------------------------------------------- /history/autumn2018.md: -------------------------------------------------------------------------------- 1 | ## Syksyn 2018 ohjelmistotuotantoprojektit 2 | 3 | ### Parhaat käytänteet 4 | 5 | Ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 6 | 7 | ### Ryhmien repot 8 | - [Aikavälikertaus](https://github.com/ohtu-aikavali) 9 | - [Quer.io](https://github.com/Quer-io/Quer.io) 10 | - [Rekrytyökalu](https://github.com/ohtu-rekry) 11 | - Partio 12 | - [Frontend](https://github.com/partio-scout/tosu-frontend) 13 | - [Backend (uusi)](https://github.com/partio-scout/tosu-backend-node) 14 | - [Backend (vanha)](https://github.com/partio-scout/tosu-backend 15 | - [Ohtuprojekti-ilmo](https://github.com/ohtuprojekti-ilmo) 16 | 17 | 18 | 19 | ### Dokumentaatio 20 | 21 | - Aikavälikertaus 22 | - [backlog](https://docs.google.com/spreadsheets/d/1eLOK-ZdBtr7S7bItJMD2JX7B941bgRIqcAq6uivDRaY/edit#gid=1) 23 | - Quer.io 24 | - [product backlog](https://docs.google.com/spreadsheets/d/1zoZrZ76nHl1ytfHcbrPXzbQAAnYuDqROq3syIgq6yv4/edit#gid=0) 25 | - [sprint backlog](https://docs.google.com/spreadsheets/d/1356DjMJaCLzRHgTVMD-nwnh5C8HQBULkCzGxY0TGmIg/edit#gid=0) 26 | - [drive kansio](https://drive.google.com/drive/folders/14ewSGMBRCjzhqK1nLX_qdbn0I-8p89ea) 27 | - Rekrytyökalu 28 | - [muu dokumentaato](https://drive.google.com/open?id=15oY17CYTkx-eXyyLoGN5QNCkrILjgnGNioUANWcxRZY) 29 | - [sprint backlog](https://trello.com/b/1ElKPbZ2/rekryty%C3%B6kalu) 30 | - Partio 31 | - [backlog](https://docs.google.com/spreadsheets/d/1s8WgWyk6s9hXbjHSsdBv8X7MHLPGrLpprMkqOl15yBo/edit?usp=sharing) 32 | - Ohtuprojekti-Ilmo 33 | - [Product backlog - kaikki ei julkisia](https://trello.com/b/Wv50WMSA/backlog) 34 | - [Drive](https://drive.google.com/drive/folders/1v3a2n6J6dK_4WmFbfaqIPxp1raWmBIwv) 35 | 36 | ### Sovellukset 37 | - Aikavälikertaus 38 | - [sovellus](https://opi.mooc.fi/#/login) 39 | - Quer.io 40 | - ei web-sovellusta 41 | - Rekrytyökalu 42 | - [staging](https://rekrysofta-staging.apps.emblica.com/) 43 | - Partio 44 | - [sovellus](https://suunnittelu.partio-ohjelma.fi/) 45 | - Ohtuprojekti-ilmo 46 | - [sovellus](https://studies.cs.helsinki.fi/projekti/) 47 | 48 | -------------------------------------------------------------------------------- /history/spring2018.md: -------------------------------------------------------------------------------- 1 | 2 | ## Kevään 2018 ohjelmistotuotantoprojektit 3 | 4 | ### parhaat käytänteet 5 | 6 | ota mallia [täältä](https://github.com/ohtu-ohjaajat/OhTuHistory/blob/master/reference.md) 7 | 8 | ### Ryhmien repot 9 | - [Labtool](https://github.com/labtool/labtool) 10 | - Hunt for glory 11 | - [backend](https://github.com/OhtuHunt/HuntForGlory) 12 | - [frontend](https://github.com/OhtuHunt/HuntForGloryFrontend) 13 | - Partio 14 | - [partio backend](https://github.com/partio-scout/tosu-backend) 15 | - [partio frontend](https://github.com/partio-scout/tosu-frontend) 16 | - Ruokavälitys 17 | - [backend](https://github.com/ohtu2018-rv/rv-backend) 18 | - [frontend](https://github.com/ohtu2018-rv/rv-app-frontend) 19 | - [Neural networks](https://github.com/Ohtu-project/Ohtu-neural-networks) 20 | - [3Dmaps](https://github.com/3Dmaps/3Dmaps) 21 | - [Vieraslajit.fi](https://github.com/Vieraslajit/Vieraslajit) 22 | 23 | ### Backlogit 24 | - Labtool [uusi](https://github.com/labtool/labtool/projects/1) [vanha](https://docs.google.com/spreadsheets/d/1wfYeFRiMauQRatbCnSYI_PLEFFzRq0rX9pKsR6tte3g/edit#gid=1798859574) 25 | - [Ruokavälitys](https://docs.google.com/spreadsheets/d/1a6bmQr5vvjFKoaNGr8-ilExtwjr2A6OBHpKnpp8d45Y/edit?usp=sharing) 26 | - [Partio](https://docs.google.com/spreadsheets/d/1cA-ldx-M_ppxSicxjL06BmAjhoNi5I55M5BugoUBD98/edit#gid=0) 27 | - [Hunt for glory](https://docs.google.com/spreadsheets/d/17PduZQHrmnuX6p_RP01JO7bq5TDrcI7-3gSi1h1wwI4/edit?ts=5a5c6da6#gid=0) 28 | - [Neural Networks](https://docs.google.com/spreadsheets/d/1pWFfQ25zzc4l9Z6x5c-glNwFVsxB1zB1c1MTcro23Ak/edit?usp=sharing) 29 | - [3Dmaps](https://docs.google.com/spreadsheets/d/15aIlJD48ZQKQ7nGFM40B4Lvwt3_bHjMlxDbJSRVtRH8/edit) 30 | - [Vieraslajit](https://docs.google.com/spreadsheets/d/1J_Fyd4nz4NiaO80L46lcEIjyo2mbTOU2jSYKFGTQdM4/edit#gid=0) 31 | 32 | ### Tuotantosovellukset 33 | - Ruokavälitys 34 | - [staging](https://rv-frontend-dev.herokuapp.com/) 35 | - [tuotanto](https://rv-frontend.herokuapp.com/) 36 | - labtool 37 | - [staging](https://svm-61.cs.helsinki.fi/labtool/) toimii vain laitoksen verkossa 38 | - [tuotanto](https://studies.cs.helsinki.fi/labtool/) 39 | - Partio 40 | - [Hunt for glory](http://huntforglory.herokuapp.com/) 41 | - 3DMaps - TBA 42 | -------------------------------------------------------------------------------- /history/spring2022.md: -------------------------------------------------------------------------------- 1 | ## Kevään 2022 ohjelmistotuotantoprojektit 2 | 3 | ### Parhaat käytänteet 4 | 5 | ota mallia [täältä](https://github.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/blob/master/best-practices.md) 6 | 7 | ### Ryhmien repot 8 | 9 | - [TaxonManager](https://github.com/karilint/TaxonManager) 10 | - [Sukellusilmoitus](https://github.com/Sukellusilmoitus) 11 | - [Farmasian VR-peli](https://github.com/MikkoHimanka/farmasia-vr) 12 | - [Webbipohjainen (Moodle) työkalu suullisen kielitaidon harjoitteluun](https://github.com/aalto-speech/moodle-puheentunnistus) 13 | - [Serverless data parser tool for project proposals](https://github.com/Ohtu-org/Serverless-data-parser-tool-for-project-proposals) 14 | - [Assembler - Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl) 15 | - [XR demonstrator](https://github.com/UbiKampus-ohtu) 16 | - [Eläinlääkiksen luupeli](https://version.helsinki.fi/luupeli/Luupeli) 17 | 18 | ### Dokumentaatio 19 | 20 | - [TaxonManager](https://github.com/karilint/TaxonManager/tree/main/docs) 21 | - [Sukellusilmoitus](https://helsinkifi-my.sharepoint.com/:w:/g/personal/juhasik_ad_helsinki_fi/EcePdrwaPSdKkFvCSziiHZ8BvUHol3_TtcW4fdK60JyLJQ?e=1fDkQA) 22 | - [Farmasian VR-peli](https://github.com/MikkoHimanka/farmasia-vr/tree/dev/Docs) 23 | - [Webbipohjainen (Moodle) työkalu suullisen kielitaidon harjoitteluun](https://github.com/aalto-speech/moodle-puheentunnistus/tree/main/docs) 24 | - [Serverless data parser tool for project proposals](https://github.com/Ohtu-org/Serverless-data-parser-tool-for-project-proposals/tree/main/documentation) 25 | - [Assembler - Projektiryhmäytymistyökalu](https://github.com/UniversityOfHelsinkiCS/prkl/tree/trunk#readme) 26 | - [Eläinlääkiksen luupeli](https://version.helsinki.fi/luupeli/Luupeli/-/blob/staging/README.md) 27 | 28 | ### Tuotantosovellukset 29 | 30 | - [TaxonManager](https://Taxonmanager.it.helsinki.fi) 31 | - [Sukellusilmoitus](https://sukellusilmoitus.herokuapp.com/) 32 | - [Farmasian VR-peli](https://github.com/MikkoHimanka/farmasia-vr/releases) 33 | - [Serverless data parser tool for project proposals](https://main.dtatk8xusyguu.amplifyapp.com/) 34 | - [Assembler - Projektiryhmäytymistyökalu](https://study.cs.helsinki.fi/assembler) 35 | - [Eläinlääkiksen luupeli - ei vielä tuotannossa](http://luupeli.helsinki.fi/) 36 | -------------------------------------------------------------------------------- /itseisarvioinnin_kysymykset.md: -------------------------------------------------------------------------------- 1 | # Itsearvionnin kysymykset 2 | 3 | Ohje: Anna avovastauksiin vapaamuotoiset perustelut arvosanaehdotuksille. Voit käyttää apuna vinkkeinä annettuna esimerkkejä asioista, joihin voi kiinnittää huomiota. Voit myös kertoa vapaasti mielestäsi olennaisista asioista. 4 | 5 | ## Tekninen 6 | 7 | Arvioi ryhmäläisten teknistä kontribuutiota. Kiinnitä huomioita ainakin seuraaviin: 8 | - tehtyjen taskien määrä, vaikeusaste 9 | - osallistumisesi teknisten ratkaisujen suunnitteluun 10 | - tiimille tuomasi lisäarvo tai erityisosaaminen 11 | - projektin aikana muodostuneet vastuualueet 12 | 13 | ## Prosessin noudattaminen 14 | 15 | Scrum-tiimi sopii keskenään noudattamistaan työtavoista. Kuinka hyvin noudatit niitä? Kiinnitä huomiota ainakin seuraaviin: 16 | - Oman tekemisen läpinäkyvyys 17 | - Osallistuminen dailyihin 18 | - Product ja Sprint backlogin käyttö 19 | - DoD noudattaminen 20 | - Keskittyminen taskeihin prioriteettijärjestyksessä 21 | - Tuntikirjanpidon ajantasaisuus 22 | - Aktiivisuus sprint planningissä 23 | 24 | ## Prosessin kehittäminen 25 | 26 | Toiminnan jatkuva kehittäinen (Inspect ja Adapt) on Scrumin perusperiaate. Kerro miten kukin ryhmäläinen osallistui tiimisi työskentely prosessin parantamiseen. Kiinnitä huomioita ainakin seuraaviin: 27 | - Havaitut ongelmakohdat 28 | - Ongelmien esille tuominen esim retroissa 29 | - Ratkaisujen kehittäminen ongelmiin. Esim. backlog refinement, asiakaspalavereiden valmistautumiset, branching-käytännöt, user storyjen parantaminen, jne 30 | 31 | ## Ryhmätyö 32 | 33 | Kaikki ryhmätyöskentelyn aspektit eivät ole prosessin noudattamista tai kehittämistä. Tässä voit arvioida esim seuraavia asioita 34 | - Kyky koordinoida oma toiminta muiden kanssa 35 | - Luotettavuus, täsmällisyys 36 | - On paikalla kun on sovittu 37 | - Ilmoittaa ajoissa poikkeukset 38 | - Saa kiinni työaikojen sisällä, jos on etänä 39 | - Muiden auttaminen työnteossa; ei keskity vain omaan suoritukseen 40 | - Eri asioiden monipuolinen osaaminen tai yrittäminen (vs. siiloutuminen) 41 | - Yhteisen työskentelyn mielekkääksi tekeminen, ryhmähengen ylläpito 42 | 43 | ## Asiakastyöskentely 44 | 45 | Tärkeä osa scrum tiimin tekemistä on toimiminen asiakkaan kanssa. Kuinka hyvin kukin ryhmäläinen myötävaikutti asiakkaan kanssa työskentelyn onnistumiseen. 46 | - demojen valmistelu, demojen sujuvuus 47 | - asiallinen käytös 48 | - täsmällisyys 49 | - kommunikointi 50 | - agendan laatiminen 51 | - muistiinpanojen tekeminen 52 | - user storyjen muodostaminen asiakkaan toiveista 53 | - väli- ja loppudemoon valmistautuminen 54 | -------------------------------------------------------------------------------- /best-practices.md: -------------------------------------------------------------------------------- 1 | # Linkkejä hyviin käytänteisiin 2 | 3 | Näistä vanhojen ohtuprojektin artefakteista voi ottaa mallia omaa projektia varten. Älä kuitenkaan kopioi suoraan vaan pohtikaa mitä teidän projektinne ja tiiminne tarvitsee. Voit myös lisätä vinkkejä tekemällä pr! 4 | 5 | ## Development workflown kuvaaminen 6 | 7 | - https://github.com/OhtuKisalli/project-info/blob/master/workflow.md 8 | 9 | ## Backlog 10 | 11 | ### Product backlog 12 | Ajan kuluessa GitHub Projects on saavuttanut suosiotaan niin product kuin sprint backlogien alustana. Tässä pari esimerkkiä näistä 13 | - https://github.com/orgs/Anturit/projects/2/views/1 14 | - https://github.com/orgs/marjanpoimijat/projects/3 15 | 16 | Toinen suosittu alusta backlogeille on ollut Google Sheets. 17 | - https://docs.google.com/spreadsheets/d/1a6bmQr5vvjFKoaNGr8-ilExtwjr2A6OBHpKnpp8d45Y/edit#gid=0 18 | 19 | ### Sprint backlog 20 | 21 | Sprintti 1 aika hyvä, sprintin 2 taskijako voisi olla hienosyisempi: 22 | - https://docs.google.com/spreadsheets/d/1a6bmQr5vvjFKoaNGr8-ilExtwjr2A6OBHpKnpp8d45Y/edit#gid=166436744 23 | 24 | Loistava taskijako sprintissä 1: 25 | - https://docs.google.com/spreadsheets/d/1cA-ldx-M_ppxSicxjL06BmAjhoNi5I55M5BugoUBD98/edit#gid=1159093674 26 | 27 | ## README.md 28 | 29 | Ehkä overall paras tähänastinen 30 | - https://github.com/OhtuKisalli/project-info 31 | 32 | ### Oikeaoppinen development-ohje 33 | 34 | - https://github.com/ohtu2018-rv/rv-backend 35 | 36 | ## Dokumentaatio 37 | 38 | ### Definition of Done 39 | 40 | Riittävän perusteellinen sen suhteen että asioista on mahdollista todeta ovatko ne "done" 41 | - https://docs.google.com/document/d/1eTyUjT8rQvBWOGFAobeOJKGN3qU0LiBdK6p5i7BTWTQ/edit 42 | 43 | ### REST-apin kuvaus 44 | 45 | Muuten esimerkillinen mutta formaatiksi sopisi paremmin githubin markdown: 46 | - https://docs.google.com/document/d/1NivINt2Pj7I66VPD99HeDnT9LGFb32-2YCBa1Jmjv8w/edit 47 | 48 | ### Usecasejen kuvaus 49 | 50 | - https://drive.google.com/drive/folders/0B1wLG72sys_SQVBKSGFpNTJmX1E 51 | 52 | ### Arkkitehtuuri 53 | 54 | Melko perusteellinen, jopa hieman raskaahko dokumentti 55 | - https://docs.google.com/document/d/1MkSI6UdJo2KNHohv3ef9ym2W6n7OzVb3rv0yaz3nDZQ/edit 56 | 57 | Tiivis mutta informatiivinen 58 | - https://github.com/kehitysto/coaching-chatbot/blob/master/doc/architecture.md 59 | 60 | ### Development / Build pipeline arkkitehtuurikaavio 61 | 62 | - 404 63 | 64 | ### Käyttöönotto-ohje 65 | 66 | - https://github.com/kehitysto/coaching-chatbot/blob/master/doc/deploy-instructions.md 67 | 68 | ### Testaus 69 | 70 | Tiivis mutta aikalailla riittävä 71 | - https://github.com/kehitysto/coaching-chatbot/blob/master/doc/testing-instructions.md 72 | 73 | Olisi toki hyvä luonnehtia myös jos jokin osa ohjelmistosta jää automaattisen testauksen ulkopuolelle 74 | -------------------------------------------------------------------------------- /ohjeita-asiakaspalaveriin.md: -------------------------------------------------------------------------------- 1 | # Ohjeita asiakastapaamista varten: 2 | 3 | - **Olkaa ajoissa paikalla**. Demovastaava mieluiten puoli tuntia etukäteen varatussa luokassa katsomassa, että tekniikka on kunnossa. Yllätyksenä voi tulla, että ei saakaan kytkettyä projektoriin konetta tms. 4 | - **Tekniikka kuntoon**. Kun asiakas saapuu paikalle, projektorilla on jo jotain kamaa ja demo on kaikin puolin valmis alkamaan (sitä ei tarvitse aloittaa heti, mutta pointti on että on valmius aloittaa se välittömästi) 5 | - **Seuraavat storyt valmiina mielessä**. Viime tapaamisessa on todennäköisesti tullut esiin user storyjä, joita ei viime sprintissä tehty. Nämä user storyt on estimoitu viime kokouksen jälkeen ja asiakas on alustavasti priorisoinut ne viime kokouksessa, ja tämän perusteella tiimi voi tehdä alustavan ehdotuksen asiakkaalle siitä, mitä nyt uudessa sprintissä ollaan tekemässä. 6 | - **Suunnittelu!** Kannattaa suunnitella etukäteen, mitä demotaan ja miten. Demon on oltava asiakkaalle selkeä. Puheenjohtaja puhuu demon sisällön läpi ja demovastaava kliksuttelee taustalla. Jos demo vaatii testidataa, se on laitettu valmiiksi. Asiakkaan ei pidä joutua odottelemaan sitä, kun dataa luodaan, ellei nimenomaan demota luomistoimintoja. 7 | - **Agenda**. Asiakastapaamista varten on hyvä laatia etukäteen "agenda", joka on kirjattu ylös, jotta on selvää, missä järjestyksessä asioita käydään läpi. Agendan voi jakaa etukäteen asiakkaalle, jos kokee tarpeelliseksi. 8 | - **Harjoitusdemo**. Jos on paljon demottavaa tai on epäselvää, mitä tai miten demotaan, voi olla hyödyllistä vetää tiimin kesken "leikki-demo". 9 | - **Kirjuri**. Asiakastapaamisessa tulee esiin uusia user storyjä. Kirjuri kirjaa näitä lennosta ylös. Mieluiten tämä tapahtuisi niin, että kirjuria ei jouduta odottamaan ("oota mä kirjoitan tän ylös"). (Kirjuri voi toki tarvittaessa kysyä, että anteeksi, nyt en kuullut, tai mikä se story olikaan.) Kirjuri on siis eri henkilö kuin ne, jotka ovat pääosin äänessä. Muistiinpanot voivat olla raakoja ja sisältää miljoona typoa – ne kirjoitetaan sitten myöhemmin puhtaaksi. Kirjuri kirjaa myös muut sovitut ja puhutut asiat ylös. Tarvittaessa voi olla useampi kirjuri, jolloin kirjurien työnjako on hyvä sopia etukäteen selväksi. 10 | - **Yllätyksiä**. Jos uudet user storyt ovatkin yllättäen prioriteetiltaan korkeampia kuin ne, mitkä ovat tulleet aiemmin esiin ja mitkä on valittu alustavasti seuraavaan sprinttiin, pitää ehkä jotenkin lennosta muokata seuraavan sprintin suunnitelmaa. Miten sen voi tehdä, kun asiakaspalsussa on vähän paha lähteä vetämään mitään planning pokeria? Beats me. Tällaisissa tilanteissa joutuu improvisoimaan. 11 | - **Asiakaspalvelua**. Hommat tehdään helpoksi asiakkaalle. Asiakkaan aika käytetään tehokkaasti ja fiksusti. Asiakas saa hyvää palvelua. Tarkentavia kysymyksiä, ei yhdessä tyhjästä ihmettelyä. Asiakas hahmottaa, missä mennään. 12 | - **Follow-up / next steps**. Asiakastapaamisen lopuksi pitää ehdottomasti muistaa sopia (vähintään) seuraava tapaaminen. 13 | 14 | **No stress!** Ekat demot tulevat olemaan todennäköisesti sähläystä, joten ei stressiä, jos kaikki ei mene putkeen. Tärkeintä on inspect & adapt! Seuraavalla kerralla tehdään paremmin se, mikä meni heikommin aiemmilla kerroilla. :) 15 | -------------------------------------------------------------------------------- /openshift/OLD_README.md: -------------------------------------------------------------------------------- 1 | # OpenShift, vanha ohje 2 | 3 | > ÄLÄ LUE TÄTÄ OHJETTA 4 | 5 | Yliopistolla on käytössä OpenShift-konttialusta, jolla voi ajaa projektin testi- sekä tuotantoversioita. Konttialustan wiki-sivut löytyvät [täältä](https://wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehitt%C3%A4j%C3%A4n%20ohjeet/Alustat/Tiken%20konttialusta/). Ohtuprojektin osallistujilla on käyttöoikeudet (sen jälkeen kun ne lisätään, eli jos tarvitsette OpenShiftiä, pyytäkää pääsyä ohjaajaltanne) konttialustan testipuolen projektiin `ohtuprojekti-staging` osoitteessa [console-openshift-console.apps.ocp-test-0.k8s.it.helsinki.fi](https://console-openshift-console.apps.ocp-test-0.k8s.it.helsinki.fi/). 6 | 7 | Usein kysyttyjä kysymyksiä https://github.com/HY-TKTL/TKT20007-Ohjelmistotuotantoprojekti/blob/master/openshift/faq.md 8 | 9 | Lue https://devops.pages.helsinki.fi/guides/tike-container-platform/instructions/all-in-one.html 10 | 11 | ## Esimerkkiprojektit 12 | 13 | OpenShiftiin on konfiguroitu kaksi yliopiston kirjautumista käyttävää esimerkkiprojektia ks. [github.com/UniversityOfHelsinkiCS/shibboleth-postgres-example](https://github.com/UniversityOfHelsinkiCS/shibboleth-postgres-example) sekä [github.com/UniversityOfHelsinkiCS/openid-mongo-example](https://github.com/UniversityOfHelsinkiCS/openid-mongo-example/). 14 | 15 | Jos on tarve yliopiston kirjautumiselle ks. [kirjautuminen.md](kirjautuminen.md). 16 | 17 | ## Tietokannat 18 | 19 | - [Konttialustan ohjeet](https://wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehitt%C3%A4j%C3%A4n%20ohjeet/Alustat/Tiken%20konttialusta/3%20-%20Ohjeet/Tietokannat/) 20 | 21 | Tietokantaa voi suorittaa konttialustalla, mutta tätä ei yleensä suositella. Parempi ratkaisu on tilata Postgres-tietokanta yliopiston yhteiskäyttöklusterille ks. [wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehittäjän ohjeet/Alustat/Yhteiskäyttöiset tietokannat/PostgreSQL/](https://wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehitt%C3%A4j%C3%A4n%20ohjeet/Alustat/Yhteisk%C3%A4ytt%C3%B6iset%20tietokannat/PostgreSQL/). 22 | 23 | Konttialustalla toimivan tietokannan pysyväistallentaminen vaati persistent volume claimin käyttöä ks. [ohjeet]([https://wiki.helsinki.fi/pages/viewpage.action?pageId=350278065](https://wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehitt%C3%A4j%C3%A4n%20ohjeet/Alustat/Tiken%20konttialusta/3%20-%20Ohjeet/3.8%20Levyn%20k%C3%A4ytt%C3%B6%20Tiken%20OpenShiftiss%C3%A4/)). Projektin `storageClassName` on `pomppa25`. Mallia voi katsoa esimerkkisovelluksista, joille on konfiguroitu pysyväistallennetut Postgres- ja Mongo-tietokannat. 24 | 25 | ### Tietokantaan yhdistäminen 26 | 27 | Konttialustan suuntaan avattuihin yliopiston yhteiskäyttökantoihin ei voi yhdistää OpenShiftin ulkopuolelta. Vastaavasti konttialustan sisällä ajettaville tietokannoille ei ole tarvetta luoda klusterin ulkopuolisen yhteyden mahdollistavaa `route`-resurssia. 28 | 29 | Tietokantoihin on siis yhdistettävä klusterin sisältä käsin. `ohtuprojekti-staging`-projektille on tätä varten konfiguroitu `db-tools` podi, joka sisältää manuaalisten tietokantayhteyksien kannalta tarvittavat työkalut, kuten `psql` ja `mongosh`. Podin sisälle pääsee käyttöliittymän kautta Topology-näkymästä painamalla podia `db-tools` -> View logs -> Terminal. 30 | 31 | Tietokantoihin voi yhdistää podin kautta myös komentorivityökalun `oc` avulla esim. 32 | 33 | ```bash 34 | oc exec -it $(oc get pods -l deployment=db-tools -o jsonpath='{.items[0].metadata.name}') -- psql postgres://kayttaja:salasana@possu-test.it.helsinki.fi:5432/tietokanta 35 | ``` 36 | 37 | Tämä edellyttää, että olet Eduroamissa ja kirjautunut klusteriin, ks lisää Tiken [konttialustaohjeesta](https://wiki.helsinki.fi/xwiki/bin/view/SO/Sovelluskehitt%C3%A4j%C3%A4n%20ohjeet/Alustat/Tiken%20konttialusta/). 38 | 39 | ## Sovelluksen julkaisu 40 | 41 | OpenShiftiin voi julkaista sovelluksia monella tavalla. Suositeltu ratkaisu on julkaista sovellus konttina johonkin konttirekisteriin, kuten [quay.io](https://quay.io/) tai [Docker Hub](https://hub.docker.com/). Uuden version sovelluksesta voi puskea rekisteriin automaattisesti esimerkiksi GitHub Actions:in avulla. 42 | 43 | OpenShiftin verkkokonsolin avulla voi helposti lisätä konttirekisteristä löytyvän kontin. Developer-näkymässä +Add-tabista löytyy kohta Container images. Täyttämällä vaaditut kentät OpenShift luo sovellukselle resurssit: `deployment`, `service`, `route` ja `imageStream`. 44 | 45 | Administrator-näkymässä -> Builds -> ImageStreams, muokkaa luotua `imageStream`-resurssia asettamalla `importPolicy` arvoksi `scheduled: true`. Tämän jälkeen OpenShift hakee 15 minuutin välein konttirekisteristä uudet julkaisut. 46 | 47 | Esimerkkisovelluksille on konfiguroitu Github Actions ja quay.io pohjainen julkaisuputki konttialustalle ks. [esimerkki](https://github.com/UniversityOfHelsinkiCS/shibboleth-postgres-example/blob/main/.github/workflows/staging.yaml). 48 | 49 | ### Resurssirajat 50 | 51 | Kun sovellus on lisätty OpenShiftiin aseta resurssirajat Topology-näkymässä painamalla sovelluksen podin kohdalla hiiren oikealla näppäimellä -> Edit resource limits. Podin Observe-tabista näkee nykyisen CPU:n ja RAM:in käytön, joita kannattaa käyttää hyödyksi rajoja asettaessa. 52 | 53 | Klusteri priorisoi sovelluksia, joille on asetettu resurssirajat. Jos resursseista on pulaa, niin ilman rajojen asettamista sovellus ei välttämättä edes käynnisty. 54 | 55 | 56 | ### Käyttöoikeudet 57 | 58 | OpenShift ei salli tietoturvasyistä konttien ajoa root-oikeuksilla. Suoritusaikaisen kontin käyttäjän UID on sattumanvarainen ja käyttäjä kuuluu aina root-ryhmään. Näin ollen tiedostoon voi antaa oikeudet esim. 59 | 60 | ```bash 61 | chgrp root tiedosto && chmod 660 tiedosto 62 | ``` 63 | -------------------------------------------------------------------------------- /learning-goals-of-software-engineering-lab.md: -------------------------------------------------------------------------------- 1 | # Learning goals of 'Software engineering lab' 2 | **_..and how Scrum helps us achieve them?_** 3 | 4 | ### Intro 5 | 6 | [Software engineering lab](https://courses.helsinki.fi/en/tkt20007) is one of the final courses in the bachelor's programme in Computer Science in the University of Helsinki. Students are divided into 4-6 person teams and a real customer will be assigned to each team. The team will build a piece of software according to the specifications given by the customer. The implementation requires a vast amount of skills gathered from various courses on topics like [programming](https://courses.helsinki.fi/en/tkt10002), [databases](https://courses.helsinki.fi/en/tkt10004), [web development](https://courses.helsinki.fi/en/tkt21009/) and [software engineering methods](https://courses.helsinki.fi/en/tkt20006). However the learning goals of this course are quite different from any of these. This is because coding for a customer with a team is very different from personal projects or programming course exercises. 7 | 8 | ### Personal project vs team work 9 | 10 | When you're building a personal project, you're the one who's creating the requirements and implementing them. So its simple like this: 11 | 12 |
13 |
14 |
19 |
20 |
8 |
9 | Kun käyttäjä kirjautuu, on nollaaminen mahdollista.
10 |
11 |
12 |
13 | Koodi on kokonaisuudessaan GitHubissa haarassa [login](https://github.com/mluukkai/openshift-demo/tree/login?tab=readme-ov-file).
14 |
15 | Katsotaan ensin kirjautumista frontendin kannalta.
16 |
17 | Sovellus kysyy aina etusivulle tultaessa kirjautuneen käyttäjän tietoja tekemällä HTTP GET -pyynnön osoitteeseen `/api/user`.
18 |
19 | Pyyntö on toteutettu Reactille tyypillisellä tavalla, eli `useEffect`-hookissa:
20 |
21 | ```js
22 | useEffect(() => {
23 | axios.get('/api/user')
24 | .then(response => {
25 | setUser(response.data)
26 | })
27 | .catch(error => {
28 | console.log('not logged in')
29 | })
30 | }, [])
31 | ```
32 |
33 | Jos käyttäjä on kirjautunut, palauttaa `/api/user` käyttäjän, joka talletetaan tilaan `user` kutsumalla funktiota `setUser`.
34 |
35 | Jos käyttäjä ei ole kirjautunut, on tilan `user` arvona `null`. Eri napit näytetään tämän perusteella.
36 |
37 | Sisään- ja uloskirjautumisen napinkäsittelijät ovat seuraavassa:
38 |
39 | ```js
40 | const onLogin = () => {
41 | window.location.href = '/api/login'
42 | }
43 |
44 | const onLogut = async () => {
45 | await axios.post('/api/logout')
46 | setUser(null)
47 | }
48 | ```
49 |
50 | Sisäänkirjautuessa vaihdetaan selaimen osoiteriville `/api/login`. Tämä saa aikaan sen, että selain tekee HTTP GET -pyynnön tähän osoitteeseen. Kirjautuminen on pakko tehdä näin sen sijaan että pyyntö tehtäisiin JavaScript-koodista (lisätietoa esim. [täällä](https://community.auth0.com/t/cors-error-when-initiating-silent-auth-requests/103208)).
51 |
52 | Kirjautumisen yhteydessä backend tekee selaimelle uudelleeohjauksen sovelluksen juuriosoitteeseen `/`. Tämän ansiosta sovellus tekee heti pyynnön `/api/user` ja saa kirjautuneen käyttäjän tiedot.
53 |
54 | Uloskirjautuminen tapahtuu tekemällä HTTP POST -pyyntö backendiin ja asettamalla tilan `user` arvoksi `null`.
55 |
56 | ## Backend passport-kirjastoa käyttäen
57 |
58 | Tarkastellaan seuraavaksi backendin koodia. Backend käyttää kirjautumisen apuna [passport](https://www.passportjs.org/)-kirjastoa. Jos käytät jotain muuta kuin Node/Expressiä backendin toteutukseen, joudut turvautumaan Googleen ja kielimalleihin.
59 |
60 | Toteutus edellyttää seuraavien kirjastojen asentamista:
61 |
62 | ```
63 | passport
64 | express-session
65 | passport-openid
66 | openid-client@5.4.3
67 | ioredis
68 | connect-redis
69 | ```
70 |
71 | Backend käyttää [Redis](https://redis.io/)-avain-arvo-tietokantaa kirjautuneiden käyttäjien sessioiden tietojen tallettamiseen. Redisistä huolehtiva deployment ja service löytyvät [täältä](https://github.com/mluukkai/openshift-demo/blob/login/manifests/redisdeployment.yaml). Määrittely on suoraviivainen, ainoa huomionarvoinen seikka on käytössä oleva image `registry.redhat.io/rhel9/redis-7` jota joudumme käyttämään OpenShiftin rajoitusten takia sillä Dockerhubissa oleva image suorittaa koodia root-tilassa ja se aiheuttaa ongelman OpenShiftin oikeuksien suhteen.
72 |
73 | Aluksi määritellään Redis, sekä [sessioista](https://www.passportjs.org/concepts/authentication/sessions/) vastaava middleware passportin käyttöön:
74 |
75 | ```js
76 | const passport = require('passport')
77 | const session = require('express-session')
78 |
79 | const SESSION_SECRET = process.env.SESSION_SECRET
80 | const REDIS_HOST = process.env.REDIS_HOST
81 |
82 | const redis = new Redis({
83 | host: REDIS_HOST,
84 | port: 6379,
85 | })
86 |
87 | app.use(session({
88 | secret: SESSION_SECRET,
89 | resave: false,
90 | saveUninitialized: false,
91 | store: new RedisStore({ client: redis }),
92 | }))
93 |
94 | app.use(passport.initialize())
95 | app.use(passport.session())
96 | ```
97 |
98 | Kirjautumista ja käyttäjänhallintaa varten tarvitaan neljä routea:
99 |
100 | ```js
101 | app.get('/api/login', passport.authenticate('oidc'))
102 |
103 | app.get('/api/login/callback', passport.authenticate('oidc', { failureRedirect: '/' }), (req, res) => {
104 | res.redirect('/')
105 | })
106 |
107 | app.post('/api/logout', (req, res, next) => {
108 | req.logout((err) => {
109 | if (err) { return next(err); }
110 | res.redirect('/');
111 | });
112 | });
113 |
114 | app.get('/api/user', async (req, res) => {
115 | console.log('User:', req.user)
116 | if (req.user) {
117 | res.json(req.user);
118 | } else {
119 | res.status(401).json({ message: 'Unauthorized' });
120 | }
121 | });
122 | ```
123 |
124 | Ensimmäinen route ohjaa HTTP GET `/api/login` -pyynnön yliopiston kertakirjautumispalveluun. Routeista toinen on _takaisinkutsuroute_, jota kertakirjautuminen kutsuu kirjautumisen onnistuessa. Kirjautumisen yhteydessä passport suorittaa kirjautumistoimenpiteet (joiden koodiin palaamme kohta), sekä tallettaa tiedon kirjautuneesta käyttäjästä sessioon, eli käytännössä selaimelle asetettavaan evästeeseen. Sovellus uudelleenohjataan juurisoitteeseen `/`, joka saa siis aikaan sen, että selain tekee uuden pyynnön osoitteeseen `/api/user` joka kirjautumisen ansiosta voi palauttaa `req.user`:iin passportin asettaman kirjautuneen käyttäjän.
125 |
126 | Uloskirjautumisen route on yksinkertainen. Se kutsuu funktiota [req.logout](https://www.passportjs.org/concepts/authentication/logout/), ja ohjaa selaimen juuriosoiteeseen (joka ei tapauksessamme ole aivan välttämätöntä).
127 |
128 | Käynnistyessään sovellus vielä alustaa autentikoinnin kutsumalla erillisessä tiedostossa määriteltyä funktiota:
129 |
130 | ```js
131 | app.listen(PORT, async () => {
132 | const { setupAuthentication } = await import('./oicd.mjs');
133 |
134 | await setupAuthentication()
135 | // ...
136 | }
137 | ```
138 |
139 | Oleelliset osat tiedostosta `oicd.mjs` (joka käyttää JavaScriptin ES-moduuleita) näyttävät seuraavalta:
140 |
141 | ```js
142 | const verifyLogin = async (_tokenSet, userinfo, done) => {
143 | console.log('userinfo', userinfo)
144 |
145 | const user = {
146 | id: userinfo.sub,
147 | username: userinfo.uid,
148 | name: userinfo.name,
149 | }
150 |
151 | // save user to db if that is required in your app
152 |
153 | done(null, user)
154 | }
155 |
156 | export const setupAuthentication = async () => {
157 | const client = await getClient()
158 |
159 | const object = {
160 | cn: { essential: true },
161 | name: { essential: true },
162 | given_name: { essential: true },
163 | hyGroupCn: { essential: true },
164 | email: { essential: true },
165 | family_name: { essential: true },
166 | uid: { essential: true },
167 | }
168 |
169 | const params = {
170 | scope: 'openid profile email',
171 | claims: {
172 | id_token: object,
173 | userinfo: object,
174 | },
175 | }
176 |
177 | passport.use('oidc', new openidClient.Strategy({ client, params }, verifyLogin))
178 | }
179 | ```
180 |
181 | Määrittelyn ytimessä on funktio [verifyLogin](https://www.passportjs.org/concepts/authentication/openid/), joka suoritetaan onnistuneen kirjautumisen yhteydessä. Funktion toinen parametri on kirjautumispalvelun palauttama kirjautuneen käyttäjän tiedot. Jos käyttäjien tiedot on esim. tarve tallettaa tietokantaan, tallennus tulee tehdä tässä kohtaa jos kirjautunutta käyttäjää ei vielä tietokannasta löydy. Funktion lopussa kutsutaan kolmatta parametria antamalla kutsussa parametrina ne tiedot joita passportin halutaan palauttavan kutsun `req.user` yhteydessä (jota käytettiin reitin GET `/api/user` käsittelijässä).
182 |
183 | Tiedoston [oidc.mjs](https://github.com/mluukkai/openshift-demo/blob/login/server/oicd.mjs) metodissa `getClient` konfiguroidaan kirjautumispalvelimelle yhteydessä oleva openidClient, joka konfiguroidaan sovelluksen kertakirjautumisjärjestelmään määritellyillä arvoilla.
184 |
185 | Kertakirjautuminen konfiguroidaan osoitteessa
193 |
194 | Selitys attribuuttien merkityksestä on [täällä](https://wiki.helsinki.fi/xwiki/bin/view/SO/User%20management/User%20attributes/). Lisää jonkinlaista ohjeistusta SP-registryn käyttöön on [täällä](https://wiki.helsinki.fi/xwiki/bin/view/SO/User%20management/SP%20Registry/).
195 |
196 | Client secretin arvo löytyy välilehden _Technical attributes_ alaosasta.
197 |
198 | Salaisuuksien arvot on määritelty sovellukselle tiedostossa `configmap.yaml`.
199 |
200 | ```yaml
201 | apiVersion: v1
202 | kind: ConfigMap
203 | metadata:
204 | name: demoapp-config
205 | data:
206 | DB_URL: postgresql://ohtuprojektitesti:passwordhere@hostnamehere:5432/ohtuprojekti?targetServerType=primary&ssl=true
207 | OIDC_CLIENT_ID: id_valuesehe_see_the_spregistry
208 | OIDC_CLIENT_SECRET: secret_secretvaluehere_see_the_spregistry
209 | OIDC_REDIRECT_URI: https://demoapp-toska-playground.ext.ocp-test-0.k8s.it.helsinki.fi/api/login/callback
210 | OIDC_ISSUER: https://login-test.it.helsinki.fi/.well-known/openid-configuration
211 | REDIS_HOST: redis-svc
212 | SESSION_SECRET: randomsecretstringhere
213 | ```
214 |
215 | Muutetaan tiedostoa `deployment.yaml` siten, että se antaa samantien kaikki configmapin määrittelemät ympäristömuuttujat podille:
216 |
217 | ```yaml
218 | spec:
219 | containers:
220 | - name: demoapp
221 | image: demoapp:login
222 | imagePullPolicy: Always
223 | ports:
224 | - containerPort: 3000
225 | envFrom:
226 | - configMapRef:
227 | name: demoapp-config
228 | ```
229 |
230 | ## Backend ilman kirjastoja käyttäen
231 |
232 | Esimerkissä käytetty passport-kirjasto piilottaa monia kirjautumiseen liittyviä yksityiskohtia. Jos käytät jotain muuta kuin JavaScript-pohjaista teknologiaa yliopistokirjautumiseen, ei passport-esimerkistä välttämättä ole kovin paljon hyötyä. Sovelluksesta on olemassa versio, joka tekee kertakirjautumisen ilman mitään kirjastoa, käyttäen ainoastaan HTTP GET- ja POST-pyyntöjä. Versio löytyy branchista [oidc](https://github.com/mluukkai/openshift-demo/tree/oidc). Sen tutkiminen voi olla hyödyksi jos toteutat kertakirjautumista esim. Python Flaskilla.
233 |
234 | ## Sovelluskehitys paikallisella koneella ja kertakirjautuminen
235 |
236 | Kertakirjautuminen aiheuttaa pienen haasteen sovelluksen kehittämiselle omalla koneella. Eräs ratkaisu tähän on ohittaa OpenID ja kovakoodata kirjautumsen tiedot backendiin. Tämä on tehty nyt tiedostoon [index.js](https://github.com/mluukkai/openshift-demo/blob/login/server/index.js#L67) seuraavasti:
237 |
238 | ```js
239 | let loggedIn = false
240 |
241 | if (process.env.NODE_ENV !== 'production') {
242 | const setMocUser = (req, res, next) => {
243 | if (!loggedIn) {
244 | return next()
245 | }
246 |
247 | req.user = {
248 | "id": "2Q6XGZP4DNWAEYVIDZV2KLXKO3Z4QEBM",
249 | "username": "mluukkai-test",
250 | "name": "Matti Luukkainen"
251 | }
252 | next()
253 | }
254 |
255 | app.use(setMocUser)
256 |
257 | app.get('/api/login', (req, res) => {
258 | loggedIn = true
259 | res.redirect('/');
260 | })
261 |
262 | app.post('/api/logout', (req, res, next) => {
263 | loggedIn = false
264 | res.redirect('/');
265 | });
266 | }
267 |
268 | // normaalisti käytettävät routet
269 | ```
270 |
271 | Jos sovellus ei ole tuotannossa, eli `process.env.NODE_ENV !== 'production'` määritelläänkin käyttäjän feikkaava middleware sekä endpointit `/api/login` ja `/api/logout`. Kun kirjautuminen tehdään, asetetaan `loggedIn = true`, ja middleware lisää `req.user`:n arvoksi kovakoodatun käyttäjän.
272 |
273 | Esimerkissä on nyt kirjoitettu lähes kaikki koodi yhteen tiedostoon. Tämä ei tietenkään ole ohtuprojektissa järkevää, ja eri asiat, mm. tietokantayhteyksien avaaminen ja erityisesti feikkikirjautuminen on hyvä eriyttää omiin moduuleihinsa.
274 |
--------------------------------------------------------------------------------
/openshift/README.md:
--------------------------------------------------------------------------------
1 | ## OpenShift-konttialustan käyttö staging-ympäristönä
2 |
3 | Tämä ohje olettaa, että hallitset jossain määrin Dockeria, esim. vähintään luvun _Docker basics_ verran kurssilta [DevOps with Docker](https://courses.mooc.fi/org/uh-cs/courses/devops-with-docker). Docker-kurssi jatkuu vielä 16.6. asti, seuraava versio kurssista alkaa toisen periodin alussa. Jokaisen käpistelijän kannattaa ehdottomasti suorittaa kurssi!
4 |
5 | Jos käytät fuksiläppäriä ja koneellasi ei ole jo Dockeria asennettuna, seuraa [tätä](https://version.helsinki.fi/cubbli/cubbli-help/-/wikis/Docker) ohjetta!
6 |
7 | ### Esimerkkisovellus
8 |
9 | Seuraavassa asennetaan yliopiston tietotekniikkakeskuksen OpenShift-klusterille Reactilla ja NodeJS:llä toteutettu SPA-sovellus, jonka koodi löytyy [GitHubista](https://github.com/mluukkai/openshift-demo).
10 |
11 | Sovellus on hyvin yksinkertainen laskuri. Laskurin arvo on talletettu Postgres-tietokantaan, johon backend on yhteydessä [Sequelize](https://sequelize.org/)-kirjaston avulla. Frontend sisältää napit laskurin kasvattamiseen sekä nollaamiseen. Käytössä ovat siis kurssilta [Full stack open](https://fullstackopen.com/) tutut teknologiat.
12 |
13 | Projektiin on määritelty GitHub Action -workflow, joka luo projektista Docker-imagen ja pushaa sen Dockerhubiin. Sama image sisältää sekä backendin, että frontendin.
14 |
15 | Sovellus on GitHubissa siinä tilanteessa mihin tämä tutoriaali päättyy. Alkutilanne on branchissa [start](https://github.com/mluukkai/openshift-demo/tree/start). Koodissa ei muutoksia ole, mutta tutoriaalin aikana tehdyt konfiguraatiot puuttuvat vielä haarasta start.
16 |
17 | ### OpenShift
18 |
19 | Käytössämme on Tietotekniikkakeskuksen [OpenShift](https://devops.pages.helsinki.fi/guides/platforms/tike-container-platform.html)-klusteri. OpenShift on [Kubernetes](https://github.com/mluukkai/openshift-demo/blob/main/.github/workflows/main.yaml)-klusteri tietyin lisämaustein.
20 |
21 | Kubernetes on melko monimutkainen olio, kurssi [DevOps with Kubernetes](https://devopswithkubernetes.com/) käsittelee aihetta laajasti. Seuraavassa käydään läpi minimioppimäärä yksinkertaisen sovelluksen tarpeisiin.
22 |
23 | Ytimessä olevan Kuberneteksen lisäksi OpenShift sisältää mm. graafisen käyttöliittymän, jonka kautta konfiguraatioita on mahdollista tehdä, mutta se **ei ole suositeltua** sillä näin päädytään usein hallitsemattoman epämääräisiin konfiguraatioihin. On suositeltavaa pitäytyä määrittelyissä mahdollisimman "puhtaassa" Kuberneteksessa, ja näin tulemme seuraavassakin tekemään.
24 |
25 | > [!CAUTION]
26 | > Älä määrittele mitään OpenShiftin käyttöliittymän kautta.
27 | > Jos teet näin, teknistä tukea ei kurssin puolesta ole luvassa.
28 |
29 | Käytämme klusteria yksinomaan komentoriviltä, komennon [oc](https://docs.redhat.com/en/documentation/openshift_container_platform/4.11/html/cli_tools/openshift-cli-oc) avulla. `oc` toimii samoin kun Kubernetesin [kubectl](https://kubernetes.io/docs/reference/kubectl/), mutta se sisältää muutamia OpenShift-spesifejä komentoja.
30 |
31 | Asenna nyt koneellesi `oc` [tämän ohjeen](https://devops.pages.helsinki.fi/guides/platforms/tike-container-platform.html#openshift-client) mukaan. Kannattaa myös ehdottomasti konfiguroida [tabulaattoritäydennys](https://docs.redhat.com/en/documentation/openshift_container_platform/4.9/html/cli_tools/openshift-cli-oc#cli-enabling-tab-completion).
32 |
33 | Oletetaan nyt, että `oc` asennettu. Jotta yhteys klusteriin toimisi, on oltava Eduroamissa tai HY:n vpn:ssä.
34 |
35 | Kirjaudu klusterille suorittamalla komento `oc login -u
40 |
41 | Kirjaudu uudelleen, ja saat toimivan kirjautumiskomennon:
42 |
43 |
44 |
45 | Kirjautumisen jälkeen voidaan vaikkapa suorittaa komento `oc status`, joka kertoo että olemme onnistuneesti kirjautuneet, omassa tapauksessani projektiin _toska-playground_:
46 |
47 | ```bash
48 | $ oc status
49 | In project toska-playground on server https://api.ocp-test-0.k8s.it.helsinki.fi:6443
50 | ```
51 |
52 | Esimerkissä on käytössä projekti `toska-playground`. Ohtuprojekteissa käytetään projektia `ohtuprojekti-staging`. Projektista on olemassa sekä tuotanto- että testipuoli. Kysy ohjaajaltasi kumpaa ryhmäsi käyttää.
53 |
54 | Testipuolen osoite on https://api.ocp-test-0.k8s.it.helsinki.fi:6443 ja tuotantopuolen https://api.ocp-prod-0.k8s.it.helsinki.fi:6443, eli kirjautuessa käytä oikeaa osoitetta! Tuotantopuolen web-konsolin osoite on Internal Server Error160 | 161 | 162 | ``` 163 | 164 | Tutkitaan sovelluksen lokia komennolla `oc logs
258 |
259 | Luodaan service, ja varmistetaan heti, että kaikki meni hyvin:
260 |
261 | ```bash
262 | $ oc apply -f manifests/service.yaml
263 | service/demoapp-svc created
264 | $ oc get svc
265 | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
266 | demoapp-svc ClusterIP 172.30.117.37
327 |
328 | Portinohjaus voidaan tehdä myös suoraan yksittäiseen podiin:
329 |
330 | ```bash
331 | $ oc port-forward demoapp-dep-5bb7578b6-2xljw 8080:3000
332 | ```
333 |
334 | Portinohjaus sopii hyvin debuggaukseen, esim. sen tarkastamiseen että sovellus toimii kokonaisuudessaan.
335 |
336 | Tarvitsemme kuitenkin todelliseen käyttöön jotain muuta. Kubernetes tarjoaa tähän kaksi ratkaisua: Ingressin ja uudemman Gateway API:n joita molemia käsitellään kurssilla [DevOps with Kubernetes](https://devopswithkubernetes.com/). Tiken OpenShiftissä joudumme kuitenkin käyttämään OpenShit-spesifiä ratkaisua [Routea](https://docs.redhat.com/en/documentation/openshift_container_platform/4.11/html/networking/configuring-routes#route-configuration).
337 |
338 | Tehdään seuraava määrittely tiedostoon `manifests/route.yaml`
339 |
340 | ```yaml
341 | apiVersion: route.openshift.io/v1
342 | kind: Route
343 | metadata:
344 | name: demoapp-route
345 | namespace: toska-playground
346 | labels:
347 | app: demoapp
348 | type: external
349 | spec:
350 | host: demoapp-toska-playground.ext.ocp-test-0.k8s.it.helsinki.fi
351 | port:
352 | targetPort: 3000
353 | to:
354 | kind: Service
355 | name: demoapp-svc
356 | tls:
357 | termination: edge
358 | insecureEdgeTerminationPolicy: Redirect
359 | wildcardPolicy: None
360 | ```
361 |
362 | Namespace on tässä tapauksessa _toska-playground_, se vastaa OpenShift-projektin nimeä, ohtuprojekteilla se on _ohtuprojekti-staging_. Host-nimen pitää olla Tiken klusteritasolla uniikki, sopiva nimi on esim. sovelluksen nimi ja sen perässä namespacen nimi. `spec/to` määrittelee reitityksen kohteena olevan palvelun. Kohdeportiksi pitää määritellä servicen takana olevan podin portti, ei siis servicen portti (joka oli tapauksessamme 80), servicen sisäistä porttia käytetään tapauksessamme klusterin sisäisessä kommunikoinnissa.
363 |
364 | Sovellus toimii nyt koko maailmalle osoitteessa https://demoapp-toska-playground.ext.ocp-test-0.k8s.it.helsinki.fi/
365 |
366 |
367 |
368 | Host-nimi riippuu myös käytetystä klusteriympäristöstä. Jos käytetään tuotantoklusteria, vaihtuu sana `test` sanaksi `prod`.
369 |
370 | ### Image stream
371 |
372 | Sovelluksessamme on nyt eräs hieman ikävä puoli. Jos haluamme käynnistää uuden version, tulee luoda Docker-image jolla on uusi tagi, esim mluukkai/demoapp:2 ja deploymentia on muutettava siten, että se viittaa muuttuneeseen tagiin.
373 |
374 | OpenShift tarjoaa [image stream](https://docs.redhat.com/en/documentation/openshift_container_platform/4.8/html/images/managing-image-streams) -nimisen objektin, jonka ansiosta deploymentin on mahdollista viitata koko ajan samaan tagiin, ja taustalla olevan imagen päivittyminen Dockerhubiin otetaan tästä huolimatta huomioon.
375 |
376 | Muutetaan Dockerhubiin pushattavan imagen tagiksi _mluukkai/demoapp:staging_:
377 |
378 | ```yaml
379 | - name: Build and push Docker image
380 | uses: docker/build-push-action@v4
381 | with:
382 | context: .
383 | push: true
384 | tags: ${{ secrets.DOCKER_USERNAME }}/demoapp:staging
385 | ```
386 |
387 | Luodaan nyt seuraava määrittely tiedostoon _imagestream.yaml_:
388 |
389 | ```yaml
390 | kind: ImageStream
391 | apiVersion: image.openshift.io/v1
392 |
393 | metadata:
394 | name: demoapp
395 | labels:
396 | app: demoapp
397 | spec:
398 | lookupPolicy:
399 | local: false
400 | tags:
401 | - name: staging
402 | from:
403 | kind: DockerImage
404 | name: mluukkai/demoapp:staging
405 | importPolicy:
406 | scheduled: true
407 | referencePolicy:
408 | type: Local
409 | ```
410 |
411 | Tämä määrittelee imagestreamin nimeltään _demoapp_, ja sille tägin _staging_, mihin viitataan esim. deploymenteissa nimellä `demoapp:staging`.
412 |
413 | Luodaan imagestream ja tarkistetaan vielä miltä se näyttää
414 |
415 | ```bash
416 | $ oc apply -f manifests/imagestream.yaml
417 | imagestream.image.openshift.io/demoapp created
418 | $ oc get imagestream
419 | NAME IMAGE REPOSITORY TAGS UPDATED
420 | demoapp registry.apps.ocp-test-0.k8s.it.helsinki.fi/toska-playground/demoapp staging 4 seconds ag
421 | ```
422 |
423 | Voimme nyt ottaa image streamin viittaaman imagen käyttöön muokkaamalla deploymentia seuraavasti
424 |
425 | ```yaml
426 | apiVersion: apps/v1
427 | kind: Deployment
428 | metadata:
429 | annotations:
430 | alpha.image.policy.openshift.io/resolve-names: "*"
431 | image.openshift.io/triggers: >-
432 | [{"from":{"kind":"ImageStreamTag","name":"demoapp:staging","namespace":"toska-playground"},"fieldPath":"spec.template.spec.containers[?(@.name==\"demoapp\")].image","pause":"false"}]
433 | name: demoapp-dep
434 | spec:
435 | replicas: 1
436 | selector:
437 | matchLabels:
438 | app: demoapp
439 | template:
440 | metadata:
441 | labels:
442 | app: demoapp
443 | spec:
444 | containers:
445 | - name: demoapp
446 | image: demoapp:staging
447 | imagePullPolicy: Always
448 | ports:
449 | - containerPort: 3000
450 | env:
451 | - name: DB_URL
452 | value: postgresql://ohtuprojektitesti:passwordhere@hostnamehere:5432/ohtuprojektitesti?targetServerType=primary&ssl=true
453 | ```
454 |
455 | Uutta tässä on avaimeen `meta/annotations` lisätyt määreet, jotka saavat deploymentin seuraamaan image streamissa tapahtuvia muutoksia. Toinen muutos on kontainerin `image`, joka arvo on nyt `demoapp:staging`, eli viite image streamiin.
456 |
457 | Image stream päivittyy 15 min välein, eli jos pushaamme sovelluksesta uuden version Dockerhubiin, kestää korkeintaan 15 minuuttia, ennen kuin klusterilla oleva imagestream päivittyy, ja sovelluksen uusi versio käynnistyy.
458 |
459 | Jos on tarve nopeampaan päivitykseen, voidaan suorittaa komento `oc import-image demoapp:staging` joka päivittää imagestreamin välittömästi, sekä käynnistää podin uudelleen jos image streamin osoittama image on muuttunut.
460 |
461 | ### Konfiguraatiot
462 |
463 | Sovellus saa tietokannan osoitteen ympäristömuuttujan `DB_URL` avulla. Ympäristömuuttujan arvo määritellään deploymentissa:
464 |
465 | ```yaml
466 | spec:
467 | containers:
468 | - name: demoapp
469 | image: demoapp:staging
470 | imagePullPolicy: Always
471 | ports:
472 | - containerPort: 3000
473 | env:
474 | - name: DB_URL
475 | value: postgresql://ohtuprojektitesti:passwordhere@hostnamehere:5432/ohtuprojekti?targetServerType=primary&ssl=true
476 | ```
477 |
478 | Tämä tapa on ok mutta ei optimaali, emme esim. voi laittaa deployment.yaml:ia GitHubiin koska URL sisältää salasanan. Kubernetes tarjoaa pari mekanismia, joiden avulla konfiguraatiot voidaan eriyttää deploymenteista, käytetään nyt näistä [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/):ia.
479 |
480 | Tehdään tätä varten tiedosto `configmap.yaml`
481 |
482 | ```yaml
483 | apiVersion: v1
484 | kind: ConfigMap
485 | metadata:
486 | name: demoapp-config
487 | data:
488 | DB_URL: postgresql://ohtuprojektitesti:passwordhere@hostnamehere:5432/ohtuprojekti?targetServerType=primary&ssl=true
489 | ```
490 |
491 | Lisätään tiedoto välittömästi `.gitignore`:n, jotta tietokannan salasana ei livahda internettiin.
492 |
493 | Deploymentissa oleva ympäristömuuttujan määrittely muuttuu seuraavasti
494 |
495 | ```yaml
496 | spec:
497 | containers:
498 | - name: demoapp
499 | image: demoapp:staging
500 | imagePullPolicy: Always
501 | ports:
502 | - containerPort: 3000
503 | env:
504 | - name: DB_URL
505 | valueFrom:
506 | configMapKeyRef:
507 | name: demoapp-config
508 | key: DB_URL
509 | ```
510 |
511 | Kubernetes tarjoaa myös resurssin [Secret](https://kubernetes.io/docs/concepts/configuration/secret/), joka periaatteessa sopisi paremmin salasanan sisältävän tietokantaurlin tarpeisiin. Nimestään huolimatta secretit eivät oikeastaan tuo juurikaan turvaa, joten sivuutamme asian nyt. Myös secretejä käsitellään kurssilla [DevOps with Kubernetes](https://devopswithkubernetes.com/).
512 |
513 | ### Kustomize
514 |
515 | Sovelluksen Kubernetes-konfiguraatiot, eli manifestit on nyt talletettu hakemistoon `manifests`, ja konfiguraatioista muut paitsi salaista tietoa sisältävä `configmap.yaml` on tallennettu versionhallintaan.
516 |
517 | Koko sovelluksen konfiguraatiot voi päivittää klusterille komennolla `oc apply -f manifests`, eli antamalla parametriksi manifestit sisältämän hakemiston. Monimutkaisemmassa sovelluksessa manifestitiedostot voivat olla hajaantuneet useampaan hakemistoon ja klusterin synkronointi voi olla hankalampaa.
518 |
519 | [Kustomize](https://kustomize.io/)-työkalu (joka on nykyään sisäänrakennettu Kubernetesin komentoriville) tuo helpotusta tähän (ja tarjoaa paljon muutakin). Määritellään tiedosto `kustomize.yaml`, joka listaa yksittäiset manifestit:
520 |
521 | ```yaml
522 | apiVersion: kustomize.config.k8s.io/v1beta1
523 | kind: Kustomization
524 |
525 | resources:
526 | - manifests/configmap.yaml
527 | - manifests/route.yaml
528 | - manifests/service.yaml
529 | - manifests/imagestream.yaml
530 | - manifests/deployment.yaml
531 | ```
532 |
533 | Manifestit saadaan synkronoitua klusterille komennolla `oc apply -k .`
534 |
535 | Esimerkkimme tapauksessa Kustomize ei tuo juurikaan etuja, suuremmassa projektissa tilanne on toinen. Kurssilla [DevOps with Kubernetes](https://devopswithkubernetes.com/) asiaa käsitellään enemmän.
536 |
537 | ### Resurssirajat
538 |
539 | Klusteri priorisoi sovelluksia, joille on asetettu resurssirajat. Jos resursseista on pulaa, niin ilman rajojen asettamista sovellus ei välttämättä edes käynnisty.
540 |
541 | Deploymenteille onkin syytä asettaa [resurssirajat](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/):
542 |
543 | ```yaml
544 | apiVersion: apps/v1
545 | kind: Deployment
546 | metadata:
547 | annotations:
548 | alpha.image.policy.openshift.io/resolve-names: "*"
549 | image.openshift.io/triggers: >-
550 | [{"from":{"kind":"ImageStreamTag","name":"demoapp:staging","namespace":"toska-playground"},"fieldPath":"spec.template.spec.containers[?(@.name==\"demoapp\")].image","pause":"false"}]
551 | name: demoapp-dep
552 | spec:
553 | replicas: 1
554 | selector:
555 | matchLabels:
556 | app: demoapp
557 | template:
558 | metadata:
559 | labels:
560 | app: demoapp
561 | spec:
562 | containers:
563 | - name: demoapp
564 | image: demoapp:staging
565 | imagePullPolicy: Always
566 | ports:
567 | - containerPort: 3000
568 | env:
569 | - name: DB_URL
570 | valueFrom:
571 | configMapKeyRef:
572 | name: demoapp-config
573 | key: DB_URL
574 | resources:
575 | limits:
576 | memory: "512Mi"
577 | cpu: "500m"
578 | requests:
579 | memory: "50Mi"
580 | cpu: "50m"
581 | ```
582 |
583 | Limits määrittää enimmäismäärän laskentaresursseja, joita kontti voi käyttää. Requests määrittää resurssimäärän, joka taataan olevan saatavilla kontille.
584 |
585 | Voit säätää memory ja cpu arvoja sovelluksesi vaatimusten mukaan. Muisti määritetään MiB-yksiköissä ja CPU milliCPU-yksiköissä.
586 |
587 | Älä pyydä turhaan liikaa resursseja!
588 |
589 | ### Kooste tärkeimmistä komennoista
590 |
591 | | Komento | Kuvaus |
592 | | :------------------------------ | :------------------------------------------------------------------------------------ |
593 | | `oc get po` | listaa podit |
594 | | `oc get svc` | listaa servicet |
595 | | `oc describe po
895 |
896 | ### Ongelmatilanteita
897 |
898 | Kubernetes/OpenShift on loistava työkalu, mutta moni asia voi mennä pieleen. Kielimalleista on erittäin suuri apu yaml-manifestien kanssa, esim ChatGPT osaa bongata virheet manifesteista ja luoda niitä ainakin pääpiirteissään jos promptaus on kohtuullisella tasolla.
899 |
900 | Debugatessa ei auta oikein muu kun systemaattisuus. Komentoja `oc get`, `oc describe` ja `oc logs` ei voi koskaan käyttää liikaa...
901 |
902 | #### Lokaalisti toimiva kontti ei toimi...
903 |
904 | Käyttöoikeusongelmien kirjo voi olla moninainen riippuen kontissa ajettavasta teknologiasta. Tähän liittyy yleensä jonkinlainen tiedostojen käyttöön liittyvä virheilmoitus: 'not writable', 'permission denied'.
905 |
906 | Kun kontti käynnistetään OpenShiftissa, arvotaan kontin käyttäjäksi satunnainen UID ja käyttäjälle tulee asettaa sopivat oikeudet kontin sisälle. Esimerkkimme tilanteessa ei mitään toimenpiteitä tarvittu. Aina ei ole näin. Joissain tilanteissa selviää seuraavasti:
907 |
908 | ```dockerfile
909 | WORKDIR /app
910 |
911 | COPY . .
912 | ```
913 |
914 | voit asettaa käyttöoikeudet Dockerfilessa yksinkertaisella (joskaan ei kovin mallikelpoisella) tavalla,
915 |
916 | ```dockerfile
917 | RUN chmod -R 777 *
918 | ```
919 |
920 | jonka jälkeen käyttäjän oikeudet ulottuvat kansion /app alikansioihin ja tiedostoihin.
921 |
922 | Esimerkkitapauksena mainittakoon Pythonin virtuaaliympäristö, jota saatetaan yrittää suorittaa jossain muussa hakemistossa kuin /app, jolloin venv-moduuli ei välttämättä käynnisty laisinkaan. Sopivaa ympäristömuuttujaa käyttämällä virtuaaliympäristö voidaan asettaa suoritettavaksi /app kansion sisällä. Ympäristömuuttujia voi esitellä kontille Dockerfilen käskyllä ENV.
923 |
924 | Seuraava esimerkki toi ratkaisun ainakin erääseen Poetry-projektiin:
925 |
926 | ```dockerfile
927 | ENV POETRY_VIRTUALENVS_IN_PROJECT=true
928 | ```
929 |
930 | Jossain tilanteessa ongelman voi aiheuttaa kolmannen osapuolen image. Esim. avain-arvo-tietokanta [Redisin](https://redis.io/) virallinen [Docker image](https://hub.docker.com/_/redis) olettaa suorittavansa koodia rootin oikeuksilla. OpenShift kuitenkin vaihtaa tilalle satunnaisen ei-rootkäyttäjän ja oletusarvoisesti konfiguroitu kontti törmää ongelmiin kirjoittaessaan dataa tiedostoihin. Ongelma ratkeaa ottamalla käyttöön [Red Hatin](https://catalog.redhat.com/software/containers/rhel9/redis-7/64881353e0e10aaf1cbac8b7?gs&q=redis) versio Redisistä, esim. `registry.redhat.io/rhel9/redis-7`, joka ei edellytä root-käyttäjää. Red Hatilta löytyy OpenShiftille sopiva versio monesta yleisestä palvelusta.
931 |
932 | ### Objektien nimennästä
933 |
934 | On oleellisen tärkeää, että jokainen ryhmä nimeää Kubernetes-objektit järkevästi ja yhdenmukaisesti, siten että on mahdollista helposti päätellä minkä ryhmän tuotoksista on kyse. Jos projektin nimi olisi esim. labtool, objektien nimet noudattaisivat seuraavaa kaavaa
935 |
936 | ```
937 | labtool-backend-dep
938 | labtool-backend-svc
939 | labtool-route
940 | labtool-mongo-dep
941 | labtool-mongo-svc
942 | ```
943 |
944 | Nimi siis alkaa ryhmän nimeä edustavalla kuvaavalla merkkijonolla.
945 |
946 | Klusterille ei saa jättää mitään roskaa eikä ylimääräisiä Kubernetes-objekteja. Eli jos jokin rersurssi todetaan turhaksi, se poistetaan.
947 |
948 | Jos klusterilta löytyy holtittomasti nimettyjä objekteja, ne saatetaan poistaa ilman varoitusta.
949 |
950 | ### HY-kirjautuminen
951 |
952 | Katso erillinen [ohje](kirjautuminen.md)
953 |
--------------------------------------------------------------------------------