diff --git a/tasks/kazakov-ev/lab_2/README.md b/tasks/kazakov-ev/lab_2/README.md new file mode 100644 index 0000000..b43aa8e --- /dev/null +++ b/tasks/kazakov-ev/lab_2/README.md @@ -0,0 +1,72 @@ +# Отчёт по лабораторной работе №2 + +Выполнил: студент гр. ИСЭбд-41 Казаков Евгений. + +Вариант программы 1: Ищет в каталоге `/var/data` самый большой по объёму файл и перекладывает его в `/var/result/data.txt`. + +Вариант программы 2: Ищет набольшее число из файла `/var/data/data.txt` и сохраняет его вторую степень в `/var/result/result.txt`. + +## Создание приложений + +Создадим 2 приложения. +Был выбран язык C# и технология .NET 7, потому что хочется. + +Для создания обычных консольных приложений воспользуемся командами: + +```sh +dotnet new console -o worker-1 +dotnet new console -o worker-2 +``` + +Согласно варианту программа 1 должна брать все файлы из папки `/var/data`, получать их размер и отправлять в `/var/result/data.txt`. + +[Исходный текст программы worker-1](worker-1/Program.cs) + +Согласно варианту программа 2 должна брать строки из файла `/var/data/data.txt`, пытаться привести их к числам, а затем найти болшее и влзвести его в степень 2. +Затем результат вычислений копируется в файл `/var/result/result.txt`. + +[Исходный текст программы worker-2](worker-2/Program.cs) + +Дополнительно создан файл [.gitignore](.gitignore) для того, чтобы не закоммитить в git ничего лишнего. + +## Настройка окружения + +Для связи двух приложений воспользуемся следующей схемой: + +1. Каталог `./data` должен быть примонтирован в каталог `/var/data` для программы 1. + Оттуда будут браться исходные данные. +2. Каталог `./result-1` должен быть примонтирован в каталог `/var/result` для программы 2. + Туда будут складываться промежуточные данные. +3. Каталог `./result-1` также должен быть примонтирован в каталог `/var/data` для программы 2. + Оттуда будут браться промежуточные результаты. +4. Каталог `./result` должен быть примонтирован в каталог `/var/result` для программы 2. + Туда будут складывать результаты финальной обработки. + +Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-1/Dockerfile)) с подробным описанием процесса сборки. + +Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения. + +Дополнительно был создан файл [.dockerignore](.dockerignore) и дополнен [.gitignore](.gitignore), чтобы исключить для сборки и коммита всё лишнее. + +## Сборка и запуск + +В каталог `./data` помещены 2 файла. +Первый-самый большой файл по размеру, во втором - 100. + +Для запуска приложения необходимо ввести команду `docker compose up ---build`. + +Результат запуска после сборки: + +``` +[+] Running 2/2 + ✔ Container lab_2-worker-1-1 Created 0.0s + ✔ Container lab_2-worker-2-1 Recreated 0.1s +Attaching to lab_2-worker-1-1, lab_2-worker-2-1 +lab_2-worker-1-1 exited with code 0 +lab_2-worker-2-1 | 100 +lab_2-worker-2-1 exited with code 0 +``` + +В результате в каталоге `./result` создался файл `result.txt` с содержимым `100`, что соответствует входным данным. + +Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`. diff --git a/tasks/kazakov-ev/lab_2/var/data/test1.txt b/tasks/kazakov-ev/lab_2/data/test1.txt similarity index 57% rename from tasks/kazakov-ev/lab_2/var/data/test1.txt rename to tasks/kazakov-ev/lab_2/data/test1.txt index 5f5fbe7..b178657 100644 --- a/tasks/kazakov-ev/lab_2/var/data/test1.txt +++ b/tasks/kazakov-ev/lab_2/data/test1.txt @@ -1,3 +1,4 @@ 1 2 -3 \ No newline at end of file +3 +4 \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/data/test2.txt b/tasks/kazakov-ev/lab_2/data/test2.txt new file mode 100644 index 0000000..dbde77c --- /dev/null +++ b/tasks/kazakov-ev/lab_2/data/test2.txt @@ -0,0 +1,8 @@ +1 +4 +5 +6 +7 +8 +9 +10 \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/data/test3.txt b/tasks/kazakov-ev/lab_2/data/test3.txt new file mode 100644 index 0000000..b2a630f --- /dev/null +++ b/tasks/kazakov-ev/lab_2/data/test3.txt @@ -0,0 +1,3 @@ +1 +3 +5 \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/lab_2.sln b/tasks/kazakov-ev/lab_2/lab_2.sln index fbb5b36..b4854d0 100644 --- a/tasks/kazakov-ev/lab_2/lab_2.sln +++ b/tasks/kazakov-ev/lab_2/lab_2.sln @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{F27277D5-063E-4DE2-B614-6BD2B30D0341}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{F5373868-285B-43A5-A593-C6E64B28B404}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -16,13 +16,13 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Release|Any CPU.Build.0 = Release|Any CPU - {F27277D5-063E-4DE2-B614-6BD2B30D0341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F27277D5-063E-4DE2-B614-6BD2B30D0341}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F27277D5-063E-4DE2-B614-6BD2B30D0341}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F27277D5-063E-4DE2-B614-6BD2B30D0341}.Release|Any CPU.Build.0 = Release|Any CPU + {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Release|Any CPU.Build.0 = Release|Any CPU + {F5373868-285B-43A5-A593-C6E64B28B404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5373868-285B-43A5-A593-C6E64B28B404}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5373868-285B-43A5-A593-C6E64B28B404}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5373868-285B-43A5-A593-C6E64B28B404}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/tasks/kazakov-ev/lab_2/result/data.txt b/tasks/kazakov-ev/lab_2/result/data.txt new file mode 100644 index 0000000..dbde77c --- /dev/null +++ b/tasks/kazakov-ev/lab_2/result/data.txt @@ -0,0 +1,8 @@ +1 +4 +5 +6 +7 +8 +9 +10 \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/result/result.txt b/tasks/kazakov-ev/lab_2/result/result.txt new file mode 100644 index 0000000..105d7d9 --- /dev/null +++ b/tasks/kazakov-ev/lab_2/result/result.txt @@ -0,0 +1 @@ +100 \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/var/data/test2.txt b/tasks/kazakov-ev/lab_2/var/data/test2.txt deleted file mode 100644 index 627e109..0000000 --- a/tasks/kazakov-ev/lab_2/var/data/test2.txt +++ /dev/null @@ -1,5 +0,0 @@ -1 -1 -1 -1 -1 diff --git a/tasks/kazakov-ev/lab_2/var/data/test3.txt b/tasks/kazakov-ev/lab_2/var/data/test3.txt deleted file mode 100644 index ec47769..0000000 --- a/tasks/kazakov-ev/lab_2/var/data/test3.txt +++ /dev/null @@ -1,10 +0,0 @@ -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/worker-1/Dockerfile b/tasks/kazakov-ev/lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..3e35bb1 --- /dev/null +++ b/tasks/kazakov-ev/lab_2/worker-1/Dockerfile @@ -0,0 +1,17 @@ +#задаем базовый образ на .net 7.0 +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env +#задаем рабочую директорию +WORKDIR /src + +#в каталог копируем файлы и папки в контейнер +COPY . ./ +#создаем образы и устанавливаем данные пакеты в контейнер +RUN dotnet restore +COPY . . +RUN dotnet publish -c Release -o /publish + +FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime +WORKDIR /publish +COPY --from=build-env /publish . +#вызываем приложение во время выполнения контейнера +ENTRYPOINT ["dotnet", "worker-1.dll"] \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/worker-1/Program.cs b/tasks/kazakov-ev/lab_2/worker-1/Program.cs index 6c038fd..494a499 100644 --- a/tasks/kazakov-ev/lab_2/worker-1/Program.cs +++ b/tasks/kazakov-ev/lab_2/worker-1/Program.cs @@ -1,22 +1,24 @@ using System.Text; -string[] files = Directory.GetFiles("/var/data"); -string maxFilePath = ""; -long maxL = 0; +string[] files = Directory.GetFiles("../../../../var/data"); +string FilePath = ""; +long maxFileLenght = 0; foreach(var filePath in files){ FileInfo fileInfo = new FileInfo(filePath); - if(fileInfo.Length > maxL){ - maxL = fileInfo.Length; - maxFilePath = filePath; + if(fileInfo.Length > maxFileLenght){ + maxFileLenght = fileInfo.Length; + FilePath = filePath; } } -using (FileStream fstream = File.OpenRead(maxFilePath)){ +using (FileStream fstream = File.OpenRead(FilePath)){ byte[] buffer = new byte[fstream.Length]; await fstream.ReadAsync(buffer, 0, buffer.Length); string text = Encoding.Default.GetString(buffer); - using(FileStream fstream1 = new FileStream("/var/result/data.txt", FileMode.OpenOrCreate)){ + using(FileStream fstream1 = new FileStream("../../../../var/result/data.txt", FileMode.OpenOrCreate)){ fstream1.SetLength(0); byte[] buffer1 = Encoding.Default.GetBytes(text); await fstream1.WriteAsync(buffer1, 0, buffer1.Length); } } + + \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/worker-2/Dockerfile b/tasks/kazakov-ev/lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..0ea2530 --- /dev/null +++ b/tasks/kazakov-ev/lab_2/worker-2/Dockerfile @@ -0,0 +1,17 @@ +#задаем базовый образ на .net 6.0 +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env +#задаем рабочую директорию +WORKDIR /src + +#в каталог копируем файлы и папки в контейнер +COPY . ./ +#создаем образы и устанавливаем данные пакеты в контейнер +RUN dotnet restore +COPY . . +RUN dotnet publish -c Release -o /publish + +FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime +WORKDIR /publish +COPY --from=build-env /publish . +#вызываем приложение во время выполнения контейнера +ENTRYPOINT ["dotnet", "worker-2.dll"] \ No newline at end of file diff --git a/tasks/kazakov-ev/lab_2/worker-2/Program.cs b/tasks/kazakov-ev/lab_2/worker-2/Program.cs index 59211c8..b77234f 100644 --- a/tasks/kazakov-ev/lab_2/worker-2/Program.cs +++ b/tasks/kazakov-ev/lab_2/worker-2/Program.cs @@ -1,23 +1,23 @@ using System.Text; -int[] numbers = File.ReadAllLines("../../../../var/data/data.txt").Select(x=> int.Parse(x)).ToArray(); +string[] numbers; +using (FileStream fstream = File.OpenRead("../../../../var/result/data.txt")){ + byte[] buffer = new byte[fstream.Length]; + await fstream.ReadAsync(buffer, 0, buffer.Length); + string text = Encoding.Default.GetString(buffer); + text = text.Replace("\r\n",";"); + numbers = text.Split(new char[]{';'}); +} int maxNumber = 0; -int maxNumberCount = 0; +int n = 0; foreach(var number in numbers){ - if(number < maxNumber){ - continue; - } - if(number == maxNumber){ - maxNumberCount++; - continue; - } - if(number > maxNumber){ - maxNumber = number; - maxNumberCount = 1; + if(Convert.ToInt32(number) > maxNumber){ + maxNumber = Convert.ToInt32(number); + n = maxNumber*maxNumber; } } using(FileStream fstream = new FileStream("../../../../var/result/result.txt", FileMode.OpenOrCreate)){ - byte[] buffer = Encoding.Default.GetBytes(maxNumberCount.ToString()); + byte[] buffer = Encoding.Default.GetBytes(n.ToString()); await fstream.WriteAsync(buffer, 0, buffer.Length); } -Console.WriteLine(maxNumberCount); +Console.WriteLine(n);