2023-10-02 23:00:10 +04:00
|
|
|
|
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
|
|
|
|
|
|
|
|
|
|
**Цель**: изучение техники создания простого распределённого приложения.
|
|
|
|
|
|
|
|
|
|
**Задачи**:
|
|
|
|
|
|
|
|
|
|
1. **Согласно вашему варианту** разработать два приложения такие, что результат первого является исходными данными для второго.
|
|
|
|
|
2. Изучить файлы сборки образов docker и разработать их для созданных приложений.
|
|
|
|
|
3. Собрать файл `docker-compose.yml` для запуска приложений.
|
|
|
|
|
Разобраться с монтированием каталогов из хост-системы.
|
|
|
|
|
4. Правильно закоммитить результат без лишних файлов.
|
|
|
|
|
5. Оформить pull request по правилам и отправить его на проверку.
|
|
|
|
|
|
|
|
|
|
## Разработка двух приложений
|
|
|
|
|
|
2023-10-02 23:51:34 +04:00
|
|
|
|
Необходимо разработать 2 приложения согласно варианту.
|
|
|
|
|
Описание поиска своего варианта расположено ниже.
|
2023-10-02 23:00:10 +04:00
|
|
|
|
|
2023-10-02 23:51:34 +04:00
|
|
|
|
Общее для всех вариантов:
|
|
|
|
|
|
|
|
|
|
* Язык разработки приложений — любой.
|
|
|
|
|
* Содержимое исходных файлов - целые числа.
|
|
|
|
|
* Результат выполнения программы 2 необходимо дополнительно вывести на экран.
|
2023-10-02 23:00:10 +04:00
|
|
|
|
|
|
|
|
|
> Автор советует использовать dotnet, java, go или python.
|
|
|
|
|
|
|
|
|
|
Каждая программа должна лежать в отдельной подпапке в репозитории, например: `tasks/moiseev-vv/lab_2/worker-1` и `tasks/moiseev-vv/lab_2/worker-2`.
|
|
|
|
|
|
2023-10-02 23:51:34 +04:00
|
|
|
|
[Пример от автора](../../tasks/moiseev-vv/lab_2/).
|
|
|
|
|
|
2023-10-02 23:00:10 +04:00
|
|
|
|
## Добавление файлов сборки `Dockerfile`
|
|
|
|
|
|
|
|
|
|
В каталоге с каждым приложением необходимо создать файл `Dockerfile`, где будут расположены инструкции по сборке образа с вашими приложениями.
|
|
|
|
|
|
|
|
|
|
> Для многих языков программирования шаблоны `Dockerfile` можно найти в Интернете.
|
|
|
|
|
|
|
|
|
|
В рамках задания необходимо расписать, за что отвечает каждая значимая строка в `Dockerfile`.
|
|
|
|
|
Хотя бы одном.
|
|
|
|
|
|
|
|
|
|
Если у вас используется multi-stage build (как в примере выше, где в одном `Dockerfile` несколько конструкций `FROM`), необходимо расписать, зачем.
|
|
|
|
|
|
|
|
|
|
## Формирование файла `docker-compose.yml`
|
|
|
|
|
|
|
|
|
|
Необходимо в каталоге с вашей работой создать файл `docker-compose.yml`, чтобы можно было собрать и запустить программы следующей командой:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
distributed-computing\tasks\moiseev-vv\lab_2$ docker compose up --build
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
> До `$` - каталог относительно корня репозитория, чтобы понять, откуда запускается `docker compose`.
|
|
|
|
|
|
|
|
|
|
Необходимо, чтобы в файле было:
|
|
|
|
|
|
|
|
|
|
1. Два сервиса.
|
|
|
|
|
Каждый соответствует вашим программам.
|
|
|
|
|
2. Объявлена директива `build` для каждого сервиса.
|
|
|
|
|
3. Была работа с монтированием папок.
|
|
|
|
|
4. Были описаны зависимости одного сервиса от другого.
|
|
|
|
|
|
2023-10-02 23:51:34 +04:00
|
|
|
|
## Оформление отчёта
|
|
|
|
|
|
|
|
|
|
Правила именования папки с отчётом и исходными текстами - `/tasks/фамилия-инициалы/lab_номер`, например, `/tasks/moiseev-vv/lab_2`.
|
|
|
|
|
|
|
|
|
|
[Пример отчёта и всего остального](../../tasks/moiseev-vv/lab_2/README.md).
|
|
|
|
|
|
2023-10-02 23:00:10 +04:00
|
|
|
|
## Коммит результата
|
|
|
|
|
|
|
|
|
|
Перед началом работы над задачей необходимо актуализировать свой форк, выполненный в работе №1.
|
|
|
|
|
|
|
|
|
|
Как это сделать зависит от конкретного хранилища git-репозиториев.
|
|
|
|
|
|
|
|
|
|
> TODO: Так как всё-таки?!
|
|
|
|
|
|
|
|
|
|
Также необходимо не забыть добавить файл `.gitignore` в каталог с вашей работой.
|
|
|
|
|
Если вы этого не сделаете, на коммит "полезут" файлы сборки и прочие вещи, который быть в публичном репозитории не должны.
|
|
|
|
|
|
|
|
|
|
> Для `dotnet` файл `.gitignore` создаётся при помощи команды `dotnet new gitignore`.
|
|
|
|
|
|
2023-10-02 23:51:34 +04:00
|
|
|
|
Правила именования ветки: `фамилия-инициалы-lab-номер`, например, `moiseev-vv-lab-2`.
|
|
|
|
|
|
2023-10-02 23:00:10 +04:00
|
|
|
|
## Правила оформления pull request
|
|
|
|
|
|
|
|
|
|
Название pull request: `[Л/Р 2] ФАМИЛИЯ ИМЯ`, например, `[Л/Р 2] Моисеев Владислав`.
|
2023-10-02 23:51:34 +04:00
|
|
|
|
|
|
|
|
|
## Варианты
|
|
|
|
|
|
|
|
|
|
Расчёт варианта также представляет собой задачку:
|
|
|
|
|
|
|
|
|
|
1. Необходимо найти номер своей зачёткой книжки.
|
|
|
|
|
Пусть будет _20/614_.
|
|
|
|
|
2. Далее необходимо найти **остаток от деления номера на 7**.
|
|
|
|
|
Это будет вариант для программы 1.
|
|
|
|
|
В нашем примере это `614 : 7 = 87 и остаток` **5**.
|
|
|
|
|
3. Вариант для программы 2 - **остаток от деления номера зачётки на 5**
|
|
|
|
|
В нашем случае это `614 : 5 = 122 и остаток` **4**.
|
|
|
|
|
|
|
|
|
|
### Варианты программы 1:
|
|
|
|
|
|
|
|
|
|
0. Ищет в каталоге `/var/data` самый большой по объёму файл и перекладывает его в `/var/result/data.txt`.
|
|
|
|
|
1. Ищет в каталоге `/var/data` файл с наибольшим количеством строк и перекладывает его в `/var/result/data.txt`.
|
|
|
|
|
2. Формирует файл `/var/result/data.txt` из первых строк всех файлов каталога `/var/data`.
|
|
|
|
|
3. Формирует файл `/var/result/data.txt` так, что каждая строка файла - количество строк в файлах из каталога `/var/data`.
|
|
|
|
|
4. Формирует файл `/var/result/data.txt` так, что каждая строка файла - количество символов в именах файлов из каталога `/var/data`.
|
|
|
|
|
5. Ищет в каталоге `/var/data` файл с самым коротким названием и перекладывает его в `/var/result/data.txt`.
|
|
|
|
|
6. Берёт из каталога `/var/data` случайный файл и перекладывает его в `/var/result/data.txt`.
|
|
|
|
|
|
|
|
|
|
### Варианты программы 2:
|
|
|
|
|
|
|
|
|
|
0. Сохраняет произведение первого и последнего числа из файла `/var/data/data.txt` в `/var/result/result.txt`.
|
|
|
|
|
1. Ищет набольшее число из файла `/var/data/data.txt` и сохраняет его вторую степень в `/var/result/result.txt`.
|
|
|
|
|
2. Ищет наименьшее число из файла `/var/data/data.txt` и сохраняет его третью степень в `/var/result/result.txt`.
|
|
|
|
|
3. Ищет набольшее число из файла `/var/data/data.txt` и сохраняет количество таких чисел из последовательности в `/var/result/result.txt`.
|
|
|
|
|
4. Ищет наименьшее число из файла `/var/data/data.txt` и сохраняет количество таких чисел из последовательности в `/var/result/result.txt`.
|