diff --git a/volkov_rafael_lab_2/README.md b/volkov_rafael_lab_2/README.md
new file mode 100644
index 0000000..847a5cf
--- /dev/null
+++ b/volkov_rafael_lab_2/README.md
@@ -0,0 +1,84 @@
+# Лабораторная работа №2 - Разработка простейшего распределенного приложения
+
+Цель: изучение техники создания простого распределенного приложения.
+
+Задачи:
+
+- Согласно вышему варианту (выбирайте любой) разработать два приложения такие, что результат первого является исходными данными для второго.
+- Изучить файлы сборки образов docker и разработать их для созданных приложений.
+- Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
+- Правильно закоммитить результат без лишних файлов.
+- Оформить pull request по правилам и отправить его на проверку.
+
+# Описание заданий двух приложений
+
+Вариант первого приложения(worker-1): 1 - Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt
+Вариант второго приложения(worker-2): 0 - сохраняет произведение первого и последнего числа из файла /var/result/data.txt в /var/result/result.txt
+
+
+
Cтруктура проекта
+
+
+
+# Работа программы
+
+- Создано две директории: worker-1 и worker-2 для двух программ.
+- Dockerfile для образов обоих программ.
+
+
Worker-1 Dockerfile
+
+
+
+
Worker-2 Dockerfile
+
+
+- Содержимое в файлах в папке data
+
+
+
+
+
+
+
+
+
+- Описание docker-compose: запускает контейнеры, реализует build для создания образов на основе dockerfile и у второго контейнера описавыется зависимость depends_on от первого контейнера, чтобы сначала запустился первый контейнер, а за ним запустился второй. Также описываются volumes, для монтирование папок data и result в контейнеры.
+
+
docker-compose
+
+
+
+
Сборка и запуска контейнеров
+
+
+
+
Docker Desktop контейнеры и образы
+
+
+
+
+
+
+
Консоль первого воркера
+
+
+
+
Консоль второго воркера
+
+
+
+
Результат работы контейнера, папка result два файла data.txt и result.txt
+
+
+
+
Содержимое data.txt
+
+
+
+
Содержимое result.txt
+
+
+
+# Видео
+
+Видео с разбором лабораторной работы - https://drive.google.com/file/d/1-sLDH9PPFeHlEqzfLtcerbGs8sCALaxe/view?usp=sharing
diff --git a/volkov_rafael_lab_2/data/f1.txt b/volkov_rafael_lab_2/data/f1.txt
new file mode 100644
index 0000000..c093316
--- /dev/null
+++ b/volkov_rafael_lab_2/data/f1.txt
@@ -0,0 +1,3 @@
+11 12 13
+21 22
+31 34
diff --git a/volkov_rafael_lab_2/data/f2.txt b/volkov_rafael_lab_2/data/f2.txt
new file mode 100644
index 0000000..5eafe8a
--- /dev/null
+++ b/volkov_rafael_lab_2/data/f2.txt
@@ -0,0 +1,2 @@
+45
+23 78
diff --git a/volkov_rafael_lab_2/data/f3.txt b/volkov_rafael_lab_2/data/f3.txt
new file mode 100644
index 0000000..799880b
--- /dev/null
+++ b/volkov_rafael_lab_2/data/f3.txt
@@ -0,0 +1,4 @@
+52 345
+23 345
+23 67
+23 20
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/docker-compose.yml b/volkov_rafael_lab_2/docker-compose.yml
new file mode 100644
index 0000000..9bdebda
--- /dev/null
+++ b/volkov_rafael_lab_2/docker-compose.yml
@@ -0,0 +1,17 @@
+services:
+ worker-1:
+ build:
+ context: /worker-1
+ dockerfile: Dockerfile
+ volumes:
+ - D:\RVIP\volkov_rafael_lab_2\data:/var/data
+ - D:\RVIP\volkov_rafael_lab_2\result:/var/result
+ worker-2:
+ build:
+ context: /worker-2
+ dockerfile: Dockerfile
+ volumes:
+ - D:\RVIP\volkov_rafael_lab_2\data:/var/data
+ - D:\RVIP\volkov_rafael_lab_2\result:/var/result
+ depends_on:
+ - worker-1
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/result/data.txt b/volkov_rafael_lab_2/result/data.txt
new file mode 100644
index 0000000..799880b
--- /dev/null
+++ b/volkov_rafael_lab_2/result/data.txt
@@ -0,0 +1,4 @@
+52 345
+23 345
+23 67
+23 20
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/result/result.txt b/volkov_rafael_lab_2/result/result.txt
new file mode 100644
index 0000000..487d273
--- /dev/null
+++ b/volkov_rafael_lab_2/result/result.txt
@@ -0,0 +1 @@
+1040
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/screens/img1.png b/volkov_rafael_lab_2/screens/img1.png
new file mode 100644
index 0000000..8a47962
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img1.png differ
diff --git a/volkov_rafael_lab_2/screens/img10.png b/volkov_rafael_lab_2/screens/img10.png
new file mode 100644
index 0000000..9de369e
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img10.png differ
diff --git a/volkov_rafael_lab_2/screens/img11.png b/volkov_rafael_lab_2/screens/img11.png
new file mode 100644
index 0000000..25e0f43
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img11.png differ
diff --git a/volkov_rafael_lab_2/screens/img12.png b/volkov_rafael_lab_2/screens/img12.png
new file mode 100644
index 0000000..8a8e2e0
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img12.png differ
diff --git a/volkov_rafael_lab_2/screens/img13.png b/volkov_rafael_lab_2/screens/img13.png
new file mode 100644
index 0000000..4e8ac96
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img13.png differ
diff --git a/volkov_rafael_lab_2/screens/img14.png b/volkov_rafael_lab_2/screens/img14.png
new file mode 100644
index 0000000..af0510f
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img14.png differ
diff --git a/volkov_rafael_lab_2/screens/img15.png b/volkov_rafael_lab_2/screens/img15.png
new file mode 100644
index 0000000..98b2045
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img15.png differ
diff --git a/volkov_rafael_lab_2/screens/img2.png b/volkov_rafael_lab_2/screens/img2.png
new file mode 100644
index 0000000..e4383e5
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img2.png differ
diff --git a/volkov_rafael_lab_2/screens/img3.png b/volkov_rafael_lab_2/screens/img3.png
new file mode 100644
index 0000000..6d229d3
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img3.png differ
diff --git a/volkov_rafael_lab_2/screens/img4.png b/volkov_rafael_lab_2/screens/img4.png
new file mode 100644
index 0000000..92a3601
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img4.png differ
diff --git a/volkov_rafael_lab_2/screens/img5.png b/volkov_rafael_lab_2/screens/img5.png
new file mode 100644
index 0000000..3d8c798
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img5.png differ
diff --git a/volkov_rafael_lab_2/screens/img6.png b/volkov_rafael_lab_2/screens/img6.png
new file mode 100644
index 0000000..a7b0dfc
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img6.png differ
diff --git a/volkov_rafael_lab_2/screens/img7.png b/volkov_rafael_lab_2/screens/img7.png
new file mode 100644
index 0000000..482193a
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img7.png differ
diff --git a/volkov_rafael_lab_2/screens/img8.png b/volkov_rafael_lab_2/screens/img8.png
new file mode 100644
index 0000000..10bd44d
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img8.png differ
diff --git a/volkov_rafael_lab_2/screens/img9.png b/volkov_rafael_lab_2/screens/img9.png
new file mode 100644
index 0000000..07c5acd
Binary files /dev/null and b/volkov_rafael_lab_2/screens/img9.png differ
diff --git a/volkov_rafael_lab_2/worker-1/.gitignore b/volkov_rafael_lab_2/worker-1/.gitignore
new file mode 100644
index 0000000..f68d109
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-1/.gitignore
@@ -0,0 +1,29 @@
+### IntelliJ IDEA ###
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/worker-1/Dockerfile b/volkov_rafael_lab_2/worker-1/Dockerfile
new file mode 100644
index 0000000..02b10f4
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-1/Dockerfile
@@ -0,0 +1,18 @@
+# Используем образ с Java
+FROM openjdk:21
+
+# Создаем директории для данных и результата внутри контейнера
+RUN mkdir /var/data
+RUN mkdir /var/result
+
+# Создаем директорию приложения внутри контейнера
+WORKDIR /app
+
+# Копируем исходные файлы вашего Java-приложения внутрь контейнера
+COPY src /app/src
+
+# Компилируем Java-код
+RUN javac /app/src/FileCopyMaxLines.java
+
+# Запускаем Java-приложение
+CMD ["java", "-cp", "/app/src", "FileCopyMaxLines"]
diff --git a/volkov_rafael_lab_2/worker-1/src/FileCopyMaxLines.java b/volkov_rafael_lab_2/worker-1/src/FileCopyMaxLines.java
new file mode 100644
index 0000000..56d98cf
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-1/src/FileCopyMaxLines.java
@@ -0,0 +1,58 @@
+import java.io.*;
+import java.nio.file.*;
+import java.util.*;
+
+public class FileCopyMaxLines {
+ public static void main(String[] args) {
+ String sourceDir = "/var/data";
+ String destinationFile = "/var/result/data.txt";
+
+ try {
+ // Создаем файл, если он не существует
+ File file = new File(destinationFile);
+ if (!file.exists()) {
+ if (!file.createNewFile()) {
+ System.err.println("Ошибка при создании файла.");
+ return;
+ }
+ }
+
+ // Читаем содержимое каталога
+ File[] files = new File(sourceDir).listFiles();
+ if (files != null) {
+ int maxLines = 0;
+ String maxLinesFile = null;
+
+ // Ищем файл с наибольшим количеством строк
+ for (File f : files) {
+ if (!f.isDirectory()) {
+ String filePath = f.getAbsolutePath();
+ int lines = countLines(filePath);
+ if (lines > maxLines) {
+ maxLines = lines;
+ maxLinesFile = filePath;
+ }
+ }
+ }
+
+ if (maxLinesFile != null) {
+ // Копируем содержимое файла с наибольшим количеством строк в целевой файл
+ Path sourcePath = Paths.get(maxLinesFile);
+ byte[] data = Files.readAllBytes(sourcePath);
+ Files.write(Paths.get(destinationFile), data, StandardOpenOption.CREATE);
+ System.out.printf("Файл %s с наибольшим количеством строк (%d) скопирован в %s\n", maxLinesFile, maxLines, destinationFile);
+ } else {
+ System.out.println("Не удалось найти файлы в каталоге /var/data.");
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Метод для подсчета количества строк в файле
+ private static int countLines(String filePath) throws IOException {
+ byte[] data = Files.readAllBytes(Paths.get(filePath));
+ return new String(data).split("\r\n|\r|\n").length;
+ }
+}
diff --git a/volkov_rafael_lab_2/worker-1/worker-1.iml b/volkov_rafael_lab_2/worker-1/worker-1.iml
new file mode 100644
index 0000000..d89d290
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-1/worker-1.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/worker-2/.gitignore b/volkov_rafael_lab_2/worker-2/.gitignore
new file mode 100644
index 0000000..f68d109
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-2/.gitignore
@@ -0,0 +1,29 @@
+### IntelliJ IDEA ###
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/volkov_rafael_lab_2/worker-2/Dockerfile b/volkov_rafael_lab_2/worker-2/Dockerfile
new file mode 100644
index 0000000..f19c2d1
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-2/Dockerfile
@@ -0,0 +1,18 @@
+# Используем образ с Java
+FROM openjdk:21
+
+# Создаем директории для данных и результата внутри контейнера
+RUN mkdir /var/data
+RUN mkdir /var/result
+
+# Создаем директорию приложения внутри контейнера
+WORKDIR /app
+
+# Копируем исходные файлы вашего Java-приложения внутрь контейнера
+COPY src /app/src
+
+# Компилируем Java-код
+RUN javac /app/src/MultiplyFirstLast.java
+
+# Запускаем Java-приложение
+CMD ["java", "-cp", "/app/src", "MultiplyFirstLast"]
diff --git a/volkov_rafael_lab_2/worker-2/src/MultiplyFirstLast.java b/volkov_rafael_lab_2/worker-2/src/MultiplyFirstLast.java
new file mode 100644
index 0000000..1c34a9b
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-2/src/MultiplyFirstLast.java
@@ -0,0 +1,79 @@
+import java.io.*;
+import java.util.Scanner;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class MultiplyFirstLast {
+ public static void main(String[] args) {
+ String dataFilePath = "/var/result/data.txt";
+ String resultFilePath = "/var/result/result.txt";
+
+ try {
+ // Создаем файл, если он не существует
+ File resultFile = new File(resultFilePath);
+ if (!resultFile.exists()) {
+ if (!resultFile.createNewFile()) {
+ System.err.println("Ошибка при создании файла.");
+ return;
+ }
+ }
+
+ // Проверяем существование файла data.txt
+ File dataFile = new File(dataFilePath);
+ if (!dataFile.exists()) {
+ System.err.println("Файл data.txt не существует. Пожалуйста, выполните первую программу перед запуском второй.");
+ return;
+ }
+
+ // Читаем содержимое файла data.txt
+ StringBuilder content = new StringBuilder();
+ try (Scanner scanner = new Scanner(dataFile)) {
+ while (scanner.hasNextLine()) {
+ content.append(scanner.nextLine()).append("\n");
+ }
+ }
+
+ String[] lines = content.toString().split("\\r?\\n");
+
+ int first = 0;
+ int last = 0;
+ boolean firstFound = false;
+ boolean numbersFound = false;
+
+ for (String line : lines) {
+ String[] numbers = line.split("\\s+");
+ if (numbers.length > 0) {
+ // Преобразуем первое и последнее число в числа с плавающей точкой
+ if (!firstFound) {
+ first = Integer.parseInt(numbers[0]);
+ firstFound = true;
+ }
+ last = Integer.parseInt(numbers[numbers.length - 1]);
+ numbersFound = true;
+ }
+ }
+
+ if (!numbersFound) {
+ System.err.printf("Не найдены числа в файле %s%n", dataFilePath);
+ return;
+ }
+
+ int result = first * last;
+ String outputContent = String.valueOf(result);
+
+ // Записываем результат в файл result.txt
+ try (FileWriter writer = new FileWriter(resultFilePath)) {
+ writer.write(outputContent);
+ }
+
+ System.out.printf("Результат (%d) сохранен в файл %s%n", result, resultFilePath);
+
+ // Читаем и выводим результат из файла result.txt
+ String resultContent = new String(Files.readAllBytes(Paths.get(resultFilePath)));
+ System.out.println("Результат, лежащий в файле result - " + resultContent);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/volkov_rafael_lab_2/worker-2/worker-2.iml b/volkov_rafael_lab_2/worker-2/worker-2.iml
new file mode 100644
index 0000000..9facd37
--- /dev/null
+++ b/volkov_rafael_lab_2/worker-2/worker-2.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file