From c7ccb94de989d6573d0c2b4a0272a1003e0bbfac Mon Sep 17 00:00:00 2001
From: UrOldFriendSoul <kutygin.andrey@gmail.com>
Date: Tue, 16 Jan 2024 12:09:03 +0400
Subject: [PATCH] kutygin_andrey_lab_2_ready

---
 kutygin_andrey_lab_1/.idea/workspace.xml      |  63 +++++++++
 kutygin_andrey_lab_2/.idea/.gitignore         |   3 +
 kutygin_andrey_lab_2/.idea/jpa-buddy.xml      |   6 +
 kutygin_andrey_lab_2/.idea/misc.xml           |   9 ++
 kutygin_andrey_lab_2/.idea/modules.xml        |   8 ++
 kutygin_andrey_lab_2/README.md                | 121 ++++++++++++++++++
 kutygin_andrey_lab_2/docker-compose.yml       |  18 +++
 kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml |  11 ++
 kutygin_andrey_lab_2/var/data/Firsttxt.txt    |   5 +
 kutygin_andrey_lab_2/var/data/Secondtxt.txt   |   3 +
 kutygin_andrey_lab_2/var/data/Thirdtxt.txt    |  10 ++
 kutygin_andrey_lab_2/var/result/data.txt      |  10 ++
 kutygin_andrey_lab_2/var/result/result.txt    |   1 +
 kutygin_andrey_lab_2/worker_1/Dockerfile      |  11 ++
 kutygin_andrey_lab_2/worker_1/src/Main.java   |  40 ++++++
 kutygin_andrey_lab_2/worker_2/Dockerfile      |  11 ++
 kutygin_andrey_lab_2/worker_2/src/Main.java   |  50 ++++++++
 17 files changed, 380 insertions(+)
 create mode 100644 kutygin_andrey_lab_1/.idea/workspace.xml
 create mode 100644 kutygin_andrey_lab_2/.idea/.gitignore
 create mode 100644 kutygin_andrey_lab_2/.idea/jpa-buddy.xml
 create mode 100644 kutygin_andrey_lab_2/.idea/misc.xml
 create mode 100644 kutygin_andrey_lab_2/.idea/modules.xml
 create mode 100644 kutygin_andrey_lab_2/README.md
 create mode 100644 kutygin_andrey_lab_2/docker-compose.yml
 create mode 100644 kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
 create mode 100644 kutygin_andrey_lab_2/var/data/Firsttxt.txt
 create mode 100644 kutygin_andrey_lab_2/var/data/Secondtxt.txt
 create mode 100644 kutygin_andrey_lab_2/var/data/Thirdtxt.txt
 create mode 100644 kutygin_andrey_lab_2/var/result/data.txt
 create mode 100644 kutygin_andrey_lab_2/var/result/result.txt
 create mode 100644 kutygin_andrey_lab_2/worker_1/Dockerfile
 create mode 100644 kutygin_andrey_lab_2/worker_1/src/Main.java
 create mode 100644 kutygin_andrey_lab_2/worker_2/Dockerfile
 create mode 100644 kutygin_andrey_lab_2/worker_2/src/Main.java

diff --git a/kutygin_andrey_lab_1/.idea/workspace.xml b/kutygin_andrey_lab_1/.idea/workspace.xml
new file mode 100644
index 0000000..ea6c570
--- /dev/null
+++ b/kutygin_andrey_lab_1/.idea/workspace.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="2825a2d7-cbe6-410f-9785-96603cbb0f02" name="Changes" comment="" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
+  <component name="ProjectId" id="2aWZgD9jVzSrrT33mt6jGLtpCOt" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "RunOnceActivity.OpenProjectViewOnStart": "true",
+    "RunOnceActivity.ShowReadmeOnStart": "true",
+    "project.structure.last.edited": "Modules",
+    "project.structure.proportion": "0.15",
+    "project.structure.side.proportion": "0.2"
+  }
+}]]></component>
+  <component name="RecentsManager">
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="C:\Users\kutyg\Downloads\pibd-22-internet-programming-Lab5 (1)\kutygin_andrey_lab_1" />
+    </key>
+  </component>
+  <component name="RunManager">
+    <configuration name="docker-compose.yml.rabbitmq: Compose Deployment" type="docker-deploy" factoryName="docker-compose.yml" temporary="true" server-name="Docker">
+      <deployment type="docker-compose.yml">
+        <settings>
+          <option name="services">
+            <list>
+              <option value="rabbitmq" />
+            </list>
+          </option>
+          <option name="sourceFilePath" value="docker-compose.yml" />
+        </settings>
+      </deployment>
+      <method v="2" />
+    </configuration>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Docker.docker-compose.yml.rabbitmq: Compose Deployment" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="2825a2d7-cbe6-410f-9785-96603cbb0f02" name="Changes" comment="" />
+      <created>1704436409086</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1704436409086</updated>
+    </task>
+    <servers />
+  </component>
+</project>
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/.idea/.gitignore b/kutygin_andrey_lab_2/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/kutygin_andrey_lab_2/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/kutygin_andrey_lab_2/.idea/jpa-buddy.xml b/kutygin_andrey_lab_2/.idea/jpa-buddy.xml
new file mode 100644
index 0000000..966d5f5
--- /dev/null
+++ b/kutygin_andrey_lab_2/.idea/jpa-buddy.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JpaBuddyIdeaProjectConfig">
+    <option name="renamerInitialized" value="true" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/.idea/misc.xml b/kutygin_andrey_lab_2/.idea/misc.xml
new file mode 100644
index 0000000..cac8158
--- /dev/null
+++ b/kutygin_andrey_lab_2/.idea/misc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="18" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="jpab" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/.idea/modules.xml b/kutygin_andrey_lab_2/.idea/modules.xml
new file mode 100644
index 0000000..73acb93
--- /dev/null
+++ b/kutygin_andrey_lab_2/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/kutygin_andrey_lab_2.iml" filepath="$PROJECT_DIR$/kutygin_andrey_lab_2.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/README.md b/kutygin_andrey_lab_2/README.md
new file mode 100644
index 0000000..50511aa
--- /dev/null
+++ b/kutygin_andrey_lab_2/README.md
@@ -0,0 +1,121 @@
+**Задание**
+***
+Цель: изучение техники создания простого распределённого приложения.
+
+**Задачи**
+***
+
+Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго.
+
+Изучить файлы сборки образов docker и разработать их для созданных приложений.
+
+Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
+
+Правильно закоммитить результат без лишних файлов.
+
+Оформить pull request по правилам и отправить его на проверку.
+
+**Ход работы**
+***
+**Разворачивание сервисов:**
+***
+Были разработаны два приложения на java:
+
+worker-1 - Формирует файл /var/result/data.txt из файла, где было найдено самое большое число /var/data. 
+
+worker-2 - Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.
+
+**Исходные файлы**
+
+Исходные файлы содержат целые числа.
+
+В /var/result/data.txt проверяются числа из каждого файла и выбирается самое большое
+
+**Firsttxt.txt:**
+1
+2
+3
+4
+5
+
+**Secondtxt.txt**
+1
+2
+3
+
+**Thirdtxt.txt**
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+
+В /var/result/result.txt записывается число 100 - квадрат наибольшего числа - 10
+
+**Dockerfile**
+
+Для данной работы были созданы идентичные докер-файлы в обоих проектах.
+````
+FROM openjdk:17
+
+RUN mkdir /var/data
+RUN mkdir /var/result
+
+WORKDIR /app
+COPY src /app/src
+
+RUN javac /app/src/Main.java
+
+CMD ["java", "-cp", "/app/src", "Main"]
+````
+
+FROM - выбор базового образа
+
+RUN - создание директории внутри контейнера
+
+WORKDIR - установка рабочей директории для последующих команд
+
+COPY - копирование содержимого директории внутрь контейнера
+
+RUN - компиляция исходного кода Main.java внутри контейнера
+
+CMD - определение команды, которая выполняется при запуске контейнера. В данном случае происходит запуск программы на java и указывается пусть до Main.java
+
+**docker-compose.yml**
+````
+version: "3" #формат конфигурации Docker Compose версии 3
+
+services: #определение сервисов
+
+worker1:
+
+build:
+
+context: /worker-1 #путь к контексту сборки
+
+dockerfile: Dockerfile #имя докерфайла
+
+volumes:
+- .\var\data:/var/data #том для папки файлов
+- .\var\result:/var/result #том для папки результатов
+
+worker2:
+
+- depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
+worker1
+build:
+context: /worker-2 #путь к контексту сборки
+
+- dockerfile: Dockerfile #имя докерфайла
+
+- volumes:
+- .\var\result:/var/data #том для папки файлов
+- .\var\result:/var/result #том для папки результатов
+````
+
+Видео: https://disk.yandex.ru/d/jpeOKQ_PAO0c0Q
diff --git a/kutygin_andrey_lab_2/docker-compose.yml b/kutygin_andrey_lab_2/docker-compose.yml
new file mode 100644
index 0000000..2fd2818
--- /dev/null
+++ b/kutygin_andrey_lab_2/docker-compose.yml
@@ -0,0 +1,18 @@
+version: "3" #формат конфигурации Docker Compose версии 3
+services: #определение сервисов
+  worker1:
+    build:
+      context: /worker_1 #путь к контексту сборки
+      dockerfile: Dockerfile #имя докерфайла
+    volumes:
+      - .\var\data:/var/data #том для папки файлов
+      - .\var\result:/var/result #том для папки результатов
+  worker2:
+    depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
+      - worker1
+    build:
+      context: /worker_2 #путь к контексту сборки
+      dockerfile: Dockerfile #имя докерфайла
+    volumes:
+      - .\var\result:/var/data #том для папки файлов
+      - .\var\result:/var/result #том для папки результатов
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml b/kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
new file mode 100644
index 0000000..c90834f
--- /dev/null
+++ b/kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/var/data/Firsttxt.txt b/kutygin_andrey_lab_2/var/data/Firsttxt.txt
new file mode 100644
index 0000000..85954ea
--- /dev/null
+++ b/kutygin_andrey_lab_2/var/data/Firsttxt.txt
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/var/data/Secondtxt.txt b/kutygin_andrey_lab_2/var/data/Secondtxt.txt
new file mode 100644
index 0000000..01e79c3
--- /dev/null
+++ b/kutygin_andrey_lab_2/var/data/Secondtxt.txt
@@ -0,0 +1,3 @@
+1
+2
+3
diff --git a/kutygin_andrey_lab_2/var/data/Thirdtxt.txt b/kutygin_andrey_lab_2/var/data/Thirdtxt.txt
new file mode 100644
index 0000000..0b669b6
--- /dev/null
+++ b/kutygin_andrey_lab_2/var/data/Thirdtxt.txt
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/var/result/data.txt b/kutygin_andrey_lab_2/var/result/data.txt
new file mode 100644
index 0000000..0b669b6
--- /dev/null
+++ b/kutygin_andrey_lab_2/var/result/data.txt
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/var/result/result.txt b/kutygin_andrey_lab_2/var/result/result.txt
new file mode 100644
index 0000000..e772e62
--- /dev/null
+++ b/kutygin_andrey_lab_2/var/result/result.txt
@@ -0,0 +1 @@
+100.0
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/worker_1/Dockerfile b/kutygin_andrey_lab_2/worker_1/Dockerfile
new file mode 100644
index 0000000..499807d
--- /dev/null
+++ b/kutygin_andrey_lab_2/worker_1/Dockerfile
@@ -0,0 +1,11 @@
+FROM openjdk:17
+
+RUN mkdir /var/data
+RUN mkdir /var/result
+
+WORKDIR /app
+COPY src /app/src
+
+RUN javac /app/src/Main.java
+
+CMD ["java", "-cp", "/app/src", "Main"]
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/worker_1/src/Main.java b/kutygin_andrey_lab_2/worker_1/src/Main.java
new file mode 100644
index 0000000..2341fd7
--- /dev/null
+++ b/kutygin_andrey_lab_2/worker_1/src/Main.java
@@ -0,0 +1,40 @@
+import java.io.*;
+import java.nio.file.*;
+
+//Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
+public class Main {
+    private static Path findLargestFile(DirectoryStream<Path> stream) throws IOException {
+        long maxSize = 0;
+        Path largestFile = null;
+
+        for (Path file : stream) {
+            long size = Files.size(file);
+            if (size > maxSize) {
+                maxSize = size;
+                largestFile = file;
+            }
+        }
+
+        return largestFile;
+    }
+
+    public static void main(String[] args) {
+        Path dataDir = Path.of("/var/data");
+        Path resultDir = Path.of("/var/result");
+
+        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dataDir)) {
+            Path largestFile = findLargestFile(stream);
+
+            if (largestFile != null) {
+                Files.createFile(resultDir.resolve("data.txt"));
+                Files.copy(largestFile, resultDir.resolve("data.txt"), StandardCopyOption.REPLACE_EXISTING);
+                System.out.println(largestFile.getFileName() + " перемещён");
+            } else {
+                System.out.println("Файл не найден");
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/worker_2/Dockerfile b/kutygin_andrey_lab_2/worker_2/Dockerfile
new file mode 100644
index 0000000..499807d
--- /dev/null
+++ b/kutygin_andrey_lab_2/worker_2/Dockerfile
@@ -0,0 +1,11 @@
+FROM openjdk:17
+
+RUN mkdir /var/data
+RUN mkdir /var/result
+
+WORKDIR /app
+COPY src /app/src
+
+RUN javac /app/src/Main.java
+
+CMD ["java", "-cp", "/app/src", "Main"]
\ No newline at end of file
diff --git a/kutygin_andrey_lab_2/worker_2/src/Main.java b/kutygin_andrey_lab_2/worker_2/src/Main.java
new file mode 100644
index 0000000..9b7f2df
--- /dev/null
+++ b/kutygin_andrey_lab_2/worker_2/src/Main.java
@@ -0,0 +1,50 @@
+import java.io.*;
+import java.nio.file.*;
+import java.util.*;
+
+//Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
+public class Main {
+    public static void main(String[] args) {
+        Path dataFile = Path.of("/var/result/data.txt");
+        Path resultFile = Path.of("/var/result/result.txt");
+
+        try {
+            if (!Files.exists(dataFile)) {
+                System.out.println("Файл data.txt не существует");
+                return;
+            }
+
+            List<Integer> numbers = readNumbersFromFile(dataFile);
+            int maxNumber = findMaxNumber(numbers);
+
+            try (BufferedWriter writer = Files.newBufferedWriter(resultFile)) {
+                writer.write(String.valueOf(Math.pow(maxNumber,2)));
+            }
+
+            System.out.println("квадрат наибольшего числа " + Math.pow(maxNumber,2));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static List<Integer> readNumbersFromFile(Path dataFile) throws IOException {
+        List<Integer> numbers = new ArrayList<>();
+        try (BufferedReader reader = Files.newBufferedReader(dataFile)) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                numbers.add(Integer.parseInt(line));
+            }
+        }
+        return numbers;
+    }
+
+    private static int findMaxNumber(List<Integer> numbers) {
+        int maxNumber = Integer.MIN_VALUE;
+        for (int number : numbers) {
+            if (number > maxNumber) {
+                maxNumber = number;
+            }
+        }
+        return maxNumber;
+    }
+}
\ No newline at end of file
-- 
2.25.1