{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Zadania domowe\n", "\n", "W ramach tego modułu do zdobycia są 4 punkty. Wszystkie zadania bazują na platformie Heroku. W przypadku rozwiązania (poprawnego) zadania 1.2 nie ma potrzeby wykonywania zadania 1.1.\n", "\n", "## Zadanie 1.1 (2 punkty)\n", "Uruchom dowolną aplikacje na swoim koncie Heroku. Nazwa aplikacji musi być ustawiona na `uam-wmi-pzc--z-1-1`. Strona musi być renderowana w całości po stronie serwera i zawierać w tagu body tylko bieżący czas UTC w formacie ISO 8601 (YYYY-MM-DDThh:mm:ss+00:00) jak w poniższym przykładzie:\n", "\n", "```html\n", "\n", "\n", " Rozwiązanie zadania PZC 1.1\n", "\n", "\n", "2021-07-29T11:15:02+00:00\n", "\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sposób sprawdzania zadania\n", "Poprawność wykonania zadania można sprawdzić korzystając ze skryptu. Konieczne jest podstawienie poprawego numeru indeksu w pierwszej lini skryptu." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: bs4 in /home/faculty/bikol/.local/lib/python3.7/site-packages (0.0.1)\n", "Requirement already satisfied: beautifulsoup4 in /home/faculty/bikol/.local/lib/python3.7/site-packages (from bs4) (4.10.0)\n", "Requirement already satisfied: soupsieve>1.2 in /home/faculty/bikol/.local/lib/python3.7/site-packages (from beautifulsoup4->bs4) (2.2.1)\n", "\u001b[33mWARNING: You are using pip version 21.2.3; however, version 21.3 is available.\n", "You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\n", "\n", "========================================\n", "\n", "Zadanie 1.1 nie zaliczone\n", "\n", "========================================\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Błędny format daty:\n", "test\n", "2021-10-27T10:27:33+00:00\n" ] } ], "source": [ "from __future__ import print_function\n", "\n", "!pip3 install bs4 --user\n", "\n", "INDEX=\"329575\"\n", "\n", "from bs4 import BeautifulSoup\n", "import urllib.request\n", "from datetime import datetime\n", "from datetime import timezone\n", "import sys\n", "\n", "def eprint(*args, **kwargs):\n", " print(*args, file=sys.stderr, **kwargs)\n", "\n", "def test_solution(index):\n", " valid = False\n", " try:\n", " with urllib.request.urlopen('https://uam-wmi-pzc-'+index+'-z-1-1.herokuapp.com/') as response:\n", " html = response.read()\n", " soup = BeautifulSoup(html, 'html.parser')\n", " try:\n", " dateText = soup.body.get_text().strip()\n", " try:\n", " now = datetime.now(tz=timezone.utc)\n", " date = datetime.fromisoformat(dateText)\n", "\n", " eprint(\"Data na stronie %s\"%date)\n", " if abs(date - now).seconds < 1:\n", " valid = True\n", "\n", " except:\n", " eprint(\"Błędny format daty:\")\n", " eprint(dateText)\n", " except:\n", " eprint(\"Nie udało się pobrać treści tagu \")\n", "\n", " except urllib.error.URLError as e:\n", " eprint(e.status)\n", " \n", " return valid\n", "\n", "print(\"\\n========================================\\n\")\n", "if test_solution(INDEX):\n", " print(\"Zadanie 1.1 zaliczone\")\n", "else:\n", " print(\"Zadanie 1.1 nie zaliczone\")\n", "print(\"\\n========================================\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Zadanie 1.2 (4 punkty)\n", "Celem tego zadania jest poznanie bardziej zaawansowanych możliwości wdrażania aplikacji na platformę Heroku. \n", "\n", "Zadanie polega na uruchomieniu na platformie Heroku systemu [Gitea](https://gitea.io/). W tym celu konieczne jest przygotowanie odpowiedniego [pliku YAML](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml), który umożliwi utworzenie odpowiednich zasobów w ramach platformy Heroku oraz dokona ich konfiguracji.\n", "\n", "Jako punkt odniesienia proszę korzystać z oficjalnej instrukcji instalacji Gitea z wykorzystaniem Dockera w trybie rootless. W szczególności następujący plik `docker-compose.yml` zawiera wszystkie niezbędne informacje do wykonania zadania (należy go przetłumaczyć na plik `heroku.yml`):\n", "\n", "```YAML\n", "version: \"2\"\n", "\n", "services:\n", " server:\n", " image: gitea/gitea:1.14.5-rootless\n", " environment:\n", " - GITEA__database__DB_TYPE=postgres\n", " - GITEA__database__HOST=db:5432\n", " - GITEA__database__NAME=gitea\n", " - GITEA__database__USER=gitea\n", " - GITEA__database__PASSWD=gitea\n", " restart: always\n", " volumes:\n", " - ./data:/var/lib/gitea\n", " - ./config:/etc/gitea \n", " - /etc/timezone:/etc/timezone:ro\n", " - /etc/localtime:/etc/localtime:ro\n", " ports:\n", " - \"3000:3000\"\n", " - \"2222:2222\"\n", " depends_on:\n", " - db\n", "\n", " db:\n", " image: postgres:13\n", " restart: always\n", " environment:\n", " - POSTGRES_USER=gitea\n", " - POSTGRES_PASSWORD=gitea\n", " - POSTGRES_DB=gitea\n", " volumes:\n", " - ./postgres:/var/lib/postgresql/data\n", "```\n", "\n", "\n", "> **Wskazówka:**: Skorzystaj z usługi [Managed PostgreSQL from Heroku](https://www.heroku.com/postgres) oraz sekcji `setup` pliku `heroku.yml`.\n", "\n", "\n", "### Sposób sprawdzania zadania\n", "\n", "Zadanie to sprawdzane będzie ręcznie, jesteś zobowiązany udostępnić:\n", "\n", "1. repozytorium Git zawierające całe rozwiązanie zadania\n", "\n", " Kod na repozytorium musi być kompletny, oraz umożliwiać automatyczne wdrożenie na platformę Heroku poprzez:\n", " ```bash\n", " heroku git:remote\n", " git push heroku master\n", " ```\n", "\n", " Zakładamy przy tym, że odpowiednia aplikacja Heroku została już utwożona i skonfigurowana pod odpowiedni *stack*.\n", "\n", "1. link do wdrożonej aplikacji\n", "\n", " Wdrożona Gitea powinna hostować przynajmniej jedno repozytorium git." ] } ], "metadata": { "interpreter": { "hash": "98b0a9b7b4eaaa670588a142fd0a9b87eaafe866f1db4228be72b4211d12040f" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }