лаб
This commit is contained in:
parent
7a6fa0a5e4
commit
870fae65ac
72
tasks/kazakov-ev/lab_2/README.md
Normal file
72
tasks/kazakov-ev/lab_2/README.md
Normal file
@ -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`.
|
@ -1,3 +1,4 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
3
|
||||
4
|
8
tasks/kazakov-ev/lab_2/data/test2.txt
Normal file
8
tasks/kazakov-ev/lab_2/data/test2.txt
Normal file
@ -0,0 +1,8 @@
|
||||
1
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
3
tasks/kazakov-ev/lab_2/data/test3.txt
Normal file
3
tasks/kazakov-ev/lab_2/data/test3.txt
Normal file
@ -0,0 +1,3 @@
|
||||
1
|
||||
3
|
||||
5
|
@ -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
|
||||
|
8
tasks/kazakov-ev/lab_2/result/data.txt
Normal file
8
tasks/kazakov-ev/lab_2/result/data.txt
Normal file
@ -0,0 +1,8 @@
|
||||
1
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
1
tasks/kazakov-ev/lab_2/result/result.txt
Normal file
1
tasks/kazakov-ev/lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
||||
100
|
@ -1,5 +0,0 @@
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
@ -1,10 +0,0 @@
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
||||
10
|
17
tasks/kazakov-ev/lab_2/worker-1/Dockerfile
Normal file
17
tasks/kazakov-ev/lab_2/worker-1/Dockerfile
Normal file
@ -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"]
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
17
tasks/kazakov-ev/lab_2/worker-2/Dockerfile
Normal file
17
tasks/kazakov-ev/lab_2/worker-2/Dockerfile
Normal file
@ -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"]
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user