# Лабораторная работа №2 - Разработка простейшего распределённого приложения **Цель**: изучение техники создания простого распределённого приложения. **Задачи**: 1. **Согласно вашему варианту** разработать два приложения такие, что результат первого является исходными данными для второго. 2. Изучить файлы сборки образов docker и разработать их для созданных приложений. 3. Собрать файл `docker-compose.yml` для запуска приложений. Разобраться с монтированием каталогов из хост-системы. 4. Правильно закоммитить результат без лишних файлов. 5. Оформить pull request по правилам и отправить его на проверку. ## Разработка двух приложений Необходимо разработать 2 приложения согласно варианту. Описание поиска своего варианта расположено ниже. Общее для всех вариантов: * Язык разработки приложений — любой. * Содержимое исходных файлов - целые числа. * Результат выполнения программы 2 необходимо дополнительно вывести на экран. > Автор советует использовать dotnet, java, go или python. Каждая программа должна лежать в отдельной подпапке в репозитории, например: `tasks/moiseev-vv/lab_2/worker-1` и `tasks/moiseev-vv/lab_2/worker-2`. [Пример от автора](../../tasks/moiseev-vv/lab_2/). ## Добавление файлов сборки `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. Были описаны зависимости одного сервиса от другого. ## Оформление отчёта Правила именования папки с отчётом и исходными текстами - `/tasks/фамилия-инициалы/lab_номер`, например, `/tasks/moiseev-vv/lab_2`. [Пример отчёта и всего остального](../../tasks/moiseev-vv/lab_2/README.md). ## Коммит результата Перед началом работы над задачей необходимо актуализировать свой форк, выполненный в работе №1. Как это сделать зависит от конкретного хранилища git-репозиториев. > TODO: Так как всё-таки?! Также необходимо не забыть добавить файл `.gitignore` в каталог с вашей работой. Если вы этого не сделаете, на коммит "полезут" файлы сборки и прочие вещи, который быть в публичном репозитории не должны. > Для `dotnet` файл `.gitignore` создаётся при помощи команды `dotnet new gitignore`. Правила именования ветки: `фамилия-инициалы-lab-номер`, например, `moiseev-vv-lab-2`. ## Правила оформления pull request Название pull request: `[Л/Р 2] ФАМИЛИЯ ИМЯ`, например, `[Л/Р 2] Моисеев Владислав`. ## Варианты Расчёт варианта также представляет собой задачку: 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`.