лаб
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
|
1
|
||||||
2
|
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
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.0.31903.59
|
VisualStudioVersion = 17.0.31903.59
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
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
|
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
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -16,13 +16,13 @@ Global
|
|||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{9432BCDF-7776-40B2-BBBC-AC6715AD0B17}.Release|Any CPU.Build.0 = Release|Any CPU
|
{DFE09A1D-9DC6-4EF8-84A4-E388F323E88B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{F5373868-285B-43A5-A593-C6E64B28B404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{F5373868-285B-43A5-A593-C6E64B28B404}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{F5373868-285B-43A5-A593-C6E64B28B404}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F27277D5-063E-4DE2-B614-6BD2B30D0341}.Release|Any CPU.Build.0 = Release|Any CPU
|
{F5373868-285B-43A5-A593-C6E64B28B404}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
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;
|
using System.Text;
|
||||||
|
|
||||||
string[] files = Directory.GetFiles("/var/data");
|
string[] files = Directory.GetFiles("../../../../var/data");
|
||||||
string maxFilePath = "";
|
string FilePath = "";
|
||||||
long maxL = 0;
|
long maxFileLenght = 0;
|
||||||
foreach(var filePath in files){
|
foreach(var filePath in files){
|
||||||
FileInfo fileInfo = new FileInfo(filePath);
|
FileInfo fileInfo = new FileInfo(filePath);
|
||||||
if(fileInfo.Length > maxL){
|
if(fileInfo.Length > maxFileLenght){
|
||||||
maxL = fileInfo.Length;
|
maxFileLenght = fileInfo.Length;
|
||||||
maxFilePath = filePath;
|
FilePath = filePath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
using (FileStream fstream = File.OpenRead(maxFilePath)){
|
using (FileStream fstream = File.OpenRead(FilePath)){
|
||||||
byte[] buffer = new byte[fstream.Length];
|
byte[] buffer = new byte[fstream.Length];
|
||||||
await fstream.ReadAsync(buffer, 0, buffer.Length);
|
await fstream.ReadAsync(buffer, 0, buffer.Length);
|
||||||
string text = Encoding.Default.GetString(buffer);
|
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);
|
fstream1.SetLength(0);
|
||||||
byte[] buffer1 = Encoding.Default.GetBytes(text);
|
byte[] buffer1 = Encoding.Default.GetBytes(text);
|
||||||
await fstream1.WriteAsync(buffer1, 0, buffer1.Length);
|
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;
|
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 maxNumber = 0;
|
||||||
int maxNumberCount = 0;
|
int n = 0;
|
||||||
foreach(var number in numbers){
|
foreach(var number in numbers){
|
||||||
if(number < maxNumber){
|
if(Convert.ToInt32(number) > maxNumber){
|
||||||
continue;
|
maxNumber = Convert.ToInt32(number);
|
||||||
}
|
n = maxNumber*maxNumber;
|
||||||
if(number == maxNumber){
|
|
||||||
maxNumberCount++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(number > maxNumber){
|
|
||||||
maxNumber = number;
|
|
||||||
maxNumberCount = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
using(FileStream fstream = new FileStream("../../../../var/result/result.txt", FileMode.OpenOrCreate)){
|
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);
|
await fstream.WriteAsync(buffer, 0, buffer.Length);
|
||||||
}
|
}
|
||||||
Console.WriteLine(maxNumberCount);
|
Console.WriteLine(n);
|
||||||
|
Loading…
Reference in New Issue
Block a user