From c680a6e51d5b0a605423b4649191f78223ca3d21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=9E=D1=81=D1=82=D1=80?=
 =?UTF-8?q?=D0=BE=D0=B2=D1=81=D0=BA=D0=B0=D1=8F?= <oostrovsofa@gmail.com>
Date: Tue, 10 Oct 2023 16:55:06 +0400
Subject: [PATCH 1/2] laba done

---
 .config/dotnet-tools.json                     |   5 +
 tasks/ostrovskaya-sf/lab_2/.gitignore         | 454 ++++++++++++++++++
 tasks/ostrovskaya-sf/lab_2/README.md          |  67 +++
 tasks/ostrovskaya-sf/lab_2/data/1.txt         |   0
 tasks/ostrovskaya-sf/lab_2/data/data.txt      |   4 +
 tasks/ostrovskaya-sf/lab_2/data/sonya.txt     |   0
 tasks/ostrovskaya-sf/lab_2/docker-compose.yml |  18 +
 tasks/ostrovskaya-sf/lab_2/lab_2.sln          |  48 ++
 tasks/ostrovskaya-sf/lab_2/pic1.png           | Bin 0 -> 3275 bytes
 tasks/ostrovskaya-sf/lab_2/pic2.png           | Bin 0 -> 8563 bytes
 tasks/ostrovskaya-sf/lab_2/result-1/data.txt  |   3 +
 tasks/ostrovskaya-sf/lab_2/result/result.txt  |   1 +
 .../ostrovskaya-sf/lab_2/worker-1/Dockerfile  |  17 +
 .../ostrovskaya-sf/lab_2/worker-1/Program.cs  |  34 ++
 .../lab_2/worker-1/worker-1.csproj            |   9 +
 .../ostrovskaya-sf/lab_2/worker-2/Dockerfile  |  17 +
 .../ostrovskaya-sf/lab_2/worker-2/Program.cs  |  34 ++
 .../lab_2/worker-2/worker-2.csproj            |   9 +
 18 files changed, 720 insertions(+)
 create mode 100644 .config/dotnet-tools.json
 create mode 100644 tasks/ostrovskaya-sf/lab_2/.gitignore
 create mode 100644 tasks/ostrovskaya-sf/lab_2/README.md
 create mode 100644 tasks/ostrovskaya-sf/lab_2/data/1.txt
 create mode 100644 tasks/ostrovskaya-sf/lab_2/data/data.txt
 create mode 100644 tasks/ostrovskaya-sf/lab_2/data/sonya.txt
 create mode 100644 tasks/ostrovskaya-sf/lab_2/docker-compose.yml
 create mode 100644 tasks/ostrovskaya-sf/lab_2/lab_2.sln
 create mode 100644 tasks/ostrovskaya-sf/lab_2/pic1.png
 create mode 100644 tasks/ostrovskaya-sf/lab_2/pic2.png
 create mode 100644 tasks/ostrovskaya-sf/lab_2/result-1/data.txt
 create mode 100644 tasks/ostrovskaya-sf/lab_2/result/result.txt
 create mode 100644 tasks/ostrovskaya-sf/lab_2/worker-1/Dockerfile
 create mode 100644 tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs
 create mode 100644 tasks/ostrovskaya-sf/lab_2/worker-1/worker-1.csproj
 create mode 100644 tasks/ostrovskaya-sf/lab_2/worker-2/Dockerfile
 create mode 100644 tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs
 create mode 100644 tasks/ostrovskaya-sf/lab_2/worker-2/worker-2.csproj

diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
new file mode 100644
index 0000000..b0e38ab
--- /dev/null
+++ b/.config/dotnet-tools.json
@@ -0,0 +1,5 @@
+{
+  "version": 1,
+  "isRoot": true,
+  "tools": {}
+}
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/.gitignore b/tasks/ostrovskaya-sf/lab_2/.gitignore
new file mode 100644
index 0000000..8afdcb6
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/.gitignore
@@ -0,0 +1,454 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# Tye
+.tye/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+##
+## Visual studio for Mac
+##
+
+
+# globs
+Makefile.in
+*.userprefs
+*.usertasks
+config.make
+config.status
+aclocal.m4
+install-sh
+autom4te.cache/
+*.tar.gz
+tarballs/
+test-results/
+
+# Mac bundle stuff
+*.dmg
+*.app
+
+# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# JetBrains Rider
+.idea/
+*.sln.iml
+
+##
+## Visual Studio Code
+##
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
diff --git a/tasks/ostrovskaya-sf/lab_2/README.md b/tasks/ostrovskaya-sf/lab_2/README.md
new file mode 100644
index 0000000..23fc80a
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/README.md
@@ -0,0 +1,67 @@
+# Отчёт по лабораторной работе №2
+
+Выполнила: студентка гр. ИСЭбд-41 Островская Софья.
+
+Вариант программы 1: 
+
+4. Формирует файл `/var/result/data.txt` так, что каждая строка файла - количество символов в именах файлов из каталога `/var/data`.
+
+Вариант программы 2: 
+
+0. Сохраняет произведение первого и последнего числа из файла `/var/data/data.txt` в `/var/result/result.txt`.
+
+## Создание приложений
+
+Создадим 2 приложения.
+Был выбран язык C# и технология .NET 5.
+
+Для создания обычных консольных приложений воспользуемся командами:
+
+```sh
+dotnet new console -o worker-1
+dotnet new console -o worker-2
+```
+
+Согласно варианту, программа 1 должна сформировать файл `/var/result/data.txt`, в который построчно будут записаны числа, равные количеству символов в именах файлах каталога `/var/data`.
+
+[Исходный текст программы worker-1](worker-1/Program.cs)
+
+Согласно варианту, программа 2 должна взять первое и последнее число из файла `/var/data/data.txt`, затем выполнить операцию произведения и записать результат в `/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-2/Dockerfile)) с подробным описанием процесса сборки.
+
+Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения.
+
+## Сборка и запуск
+
+В каталог `./data` помещены 3 файла с различной длиной названия.
+
+![](pic1.png)
+
+На выходе, программа должна сначала записать числа [5 8 9], поскольку именно такую длину имеют файлы (вместе с расширением). А затем, умножив 5 на 9, получится результат программы 2, равный 45
+
+Для запуска приложения необходимо ввести команду `docker compose up --build`.
+Результат запуска после сборки:
+
+![](pic2.png)
+
+В результате в каталоге `./result` создался файл `result.txt` с содержимым `45`.
+
+Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`.
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/data/1.txt b/tasks/ostrovskaya-sf/lab_2/data/1.txt
new file mode 100644
index 0000000..e69de29
diff --git a/tasks/ostrovskaya-sf/lab_2/data/data.txt b/tasks/ostrovskaya-sf/lab_2/data/data.txt
new file mode 100644
index 0000000..b178657
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/data/data.txt
@@ -0,0 +1,4 @@
+1
+2
+3
+4
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/data/sonya.txt b/tasks/ostrovskaya-sf/lab_2/data/sonya.txt
new file mode 100644
index 0000000..e69de29
diff --git a/tasks/ostrovskaya-sf/lab_2/docker-compose.yml b/tasks/ostrovskaya-sf/lab_2/docker-compose.yml
new file mode 100644
index 0000000..9c753e7
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/docker-compose.yml
@@ -0,0 +1,18 @@
+version: "3.1"
+services:
+  worker-1:
+    build: ./worker-1
+    volumes:
+      # Монтирует локальную папку data к папке data в контейнере.
+      - ./data:/var/data
+      # Монтирует локальную папку result-1 к папке result в контейнере.
+      - ./result-1:/var/result
+  worker-2:
+    build: ./worker-2
+    volumes:
+      # Монтирует локальную папку result-1 к папке data в контейнере.
+      - ./result-1:/var/data
+      - ./result:/var/result
+    # Зависимость от первого приложения.
+    depends_on:
+      - worker-1
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/lab_2.sln b/tasks/ostrovskaya-sf/lab_2/lab_2.sln
new file mode 100644
index 0000000..c30048f
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/lab_2.sln
@@ -0,0 +1,48 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30114.105
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{27BD1451-9A65-4578-8694-DDA354866DA3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Debug|x64.Build.0 = Debug|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Debug|x86.Build.0 = Debug|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Release|x64.ActiveCfg = Release|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Release|x64.Build.0 = Release|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Release|x86.ActiveCfg = Release|Any CPU
+		{27BD1451-9A65-4578-8694-DDA354866DA3}.Release|x86.Build.0 = Release|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Debug|x64.Build.0 = Debug|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Debug|x86.Build.0 = Debug|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Release|x64.ActiveCfg = Release|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Release|x64.Build.0 = Release|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Release|x86.ActiveCfg = Release|Any CPU
+		{AD4D5CF8-D33E-45A5-B30E-FB86133562EC}.Release|x86.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal
diff --git a/tasks/ostrovskaya-sf/lab_2/pic1.png b/tasks/ostrovskaya-sf/lab_2/pic1.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee226aaa23d664d93ddb3f7b724e050adbd9eab2
GIT binary patch
literal 3275
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
T_GPm_AOLd{8$`9SYr?+(1X=A|

literal 0
HcmV?d00001

diff --git a/tasks/ostrovskaya-sf/lab_2/pic2.png b/tasks/ostrovskaya-sf/lab_2/pic2.png
new file mode 100644
index 0000000000000000000000000000000000000000..d056f790b9faf856437c063d1664e304f8256e3f
GIT binary patch
literal 8563
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
LvMjZ@l=wdYm#0N8

literal 0
HcmV?d00001

diff --git a/tasks/ostrovskaya-sf/lab_2/result-1/data.txt b/tasks/ostrovskaya-sf/lab_2/result-1/data.txt
new file mode 100644
index 0000000..2ff6a39
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/result-1/data.txt
@@ -0,0 +1,3 @@
+5
+8
+9
diff --git a/tasks/ostrovskaya-sf/lab_2/result/result.txt b/tasks/ostrovskaya-sf/lab_2/result/result.txt
new file mode 100644
index 0000000..ea90ee3
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/result/result.txt
@@ -0,0 +1 @@
+45
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-1/Dockerfile b/tasks/ostrovskaya-sf/lab_2/worker-1/Dockerfile
new file mode 100644
index 0000000..ce05e25
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/worker-1/Dockerfile
@@ -0,0 +1,17 @@
+#задаем базовый образ на .net 5.0
+FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env 
+#задаем рабочую директорию
+WORKDIR /app
+
+#в каталог копируем файлы и папки в контейнер
+COPY  . /app
+#создаем образы и устанавливаем данные пакеты в контейнер
+RUN dotnet restore
+COPY . .
+RUN dotnet publish -c Release -o /publish
+
+FROM mcr.microsoft.com/dotnet/aspnet:5.0
+WORKDIR /publish
+COPY --from=build-env /publish .
+#вызываем приложение во время выполнения контейнера
+ENTRYPOINT ["dotnet", "worker-1.dll"]
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs b/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs
new file mode 100644
index 0000000..732f173
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs
@@ -0,0 +1,34 @@
+using System;
+using System.IO;
+using System.Net.Http;
+
+var dir = new DirectoryInfo("../var/data");
+
+var files = dir.GetFiles();
+
+string resultFilePath = "../var/result/data.txt";
+try
+{
+    int[] mass = new int[files.Length];
+    int i = 0;
+    // Создаем новый файл или перезаписываем существующий
+    using (StreamWriter writer = new StreamWriter(resultFilePath, false))
+    {
+        foreach (var file in files)
+        {
+            // Записываем в файл количество символов в имени каждого файла
+            writer.WriteLine(file.Name.Length);
+            mass[i] = file.Name.Length;
+            i++;
+        }
+    }
+    Console.WriteLine("Файл успешно создан! Результат: ");
+    foreach(var item in mass)
+    {
+        Console.WriteLine(item);
+    }
+}
+catch (Exception ex)
+{
+    Console.WriteLine("Произошла ошибка: " + ex.Message);
+}
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-1/worker-1.csproj b/tasks/ostrovskaya-sf/lab_2/worker-1/worker-1.csproj
new file mode 100644
index 0000000..328500d
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/worker-1/worker-1.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net5.0</TargetFramework>
+    <RootNamespace>worker_1</RootNamespace>
+  </PropertyGroup>
+
+</Project>
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-2/Dockerfile b/tasks/ostrovskaya-sf/lab_2/worker-2/Dockerfile
new file mode 100644
index 0000000..49ab49f
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/worker-2/Dockerfile
@@ -0,0 +1,17 @@
+#задаем базовый образ на .net 5.0
+FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env 
+#задаем рабочую директорию
+WORKDIR /app
+
+#в каталог копируем файлы и папки в контейнер
+COPY  . /app
+#создаем образы и устанавливаем данные пакеты в контейнер
+RUN dotnet restore
+COPY . .
+RUN dotnet publish -c Release -o /publish
+
+FROM mcr.microsoft.com/dotnet/aspnet:5.0
+WORKDIR /publish
+COPY --from=build-env /publish .
+#вызываем приложение во время выполнения контейнера
+ENTRYPOINT ["dotnet", "worker-2.dll"]
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs b/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs
new file mode 100644
index 0000000..e11b7c1
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs
@@ -0,0 +1,34 @@
+using System;
+using System.IO;
+
+string[] lines = File.ReadAllLines("../var/data/data.txt");
+
+int firstNumber = 0;
+int lastNumber = 0;
+
+foreach (string line in lines)
+{       
+     if (int.TryParse(line, out int number))
+     {
+         firstNumber = number;
+         break;
+     }
+}
+
+for (int i = lines.Length - 1; i >= 0; i--)
+{
+     if (int.TryParse(lines[i], out int number))
+     {
+        lastNumber = number;
+        break;
+     }
+}
+
+int multiplication = firstNumber * lastNumber;
+
+using (StreamWriter writer = new StreamWriter("../var/result/result.txt"))
+{
+    writer.WriteLine(multiplication);
+}
+
+Console.WriteLine("Произведение успешно записано в файл! Результат: " + multiplication);
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-2/worker-2.csproj b/tasks/ostrovskaya-sf/lab_2/worker-2/worker-2.csproj
new file mode 100644
index 0000000..fb2480c
--- /dev/null
+++ b/tasks/ostrovskaya-sf/lab_2/worker-2/worker-2.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net5.0</TargetFramework>
+    <RootNamespace>worker_2</RootNamespace>
+  </PropertyGroup>
+
+</Project>

From 685fd6ab9bb4678af304a72d62fd6f562bff28d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=9E=D1=81=D1=82=D1=80?=
 =?UTF-8?q?=D0=BE=D0=B2=D1=81=D0=BA=D0=B0=D1=8F?= <oostrovsofa@gmail.com>
Date: Tue, 17 Oct 2023 10:35:30 +0400
Subject: [PATCH 2/2] fix

---
 .config/dotnet-tools.json                     |  5 ----
 .../ostrovskaya-sf/lab_2/worker-1/Program.cs  |  4 +--
 .../ostrovskaya-sf/lab_2/worker-2/Program.cs  | 28 +++----------------
 3 files changed, 6 insertions(+), 31 deletions(-)
 delete mode 100644 .config/dotnet-tools.json

diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
deleted file mode 100644
index b0e38ab..0000000
--- a/.config/dotnet-tools.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "version": 1,
-  "isRoot": true,
-  "tools": {}
-}
\ No newline at end of file
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs b/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs
index 732f173..716a34c 100644
--- a/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs
+++ b/tasks/ostrovskaya-sf/lab_2/worker-1/Program.cs
@@ -2,11 +2,11 @@
 using System.IO;
 using System.Net.Http;
 
-var dir = new DirectoryInfo("../var/data");
+var dir = new DirectoryInfo("/var/data");
 
 var files = dir.GetFiles();
 
-string resultFilePath = "../var/result/data.txt";
+string resultFilePath = "/var/result/data.txt";
 try
 {
     int[] mass = new int[files.Length];
diff --git a/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs b/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs
index e11b7c1..f78f1ec 100644
--- a/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs
+++ b/tasks/ostrovskaya-sf/lab_2/worker-2/Program.cs
@@ -1,32 +1,12 @@
 using System;
 using System.IO;
+using System.Linq;
 
-string[] lines = File.ReadAllLines("../var/data/data.txt");
+string[] lines = File.ReadAllLines("/var/data/data.txt");
 
-int firstNumber = 0;
-int lastNumber = 0;
+int multiplication = Convert.ToInt32(lines.First()) * Convert.ToInt32(lines.Last());
 
-foreach (string line in lines)
-{       
-     if (int.TryParse(line, out int number))
-     {
-         firstNumber = number;
-         break;
-     }
-}
-
-for (int i = lines.Length - 1; i >= 0; i--)
-{
-     if (int.TryParse(lines[i], out int number))
-     {
-        lastNumber = number;
-        break;
-     }
-}
-
-int multiplication = firstNumber * lastNumber;
-
-using (StreamWriter writer = new StreamWriter("../var/result/result.txt"))
+using (StreamWriter writer = new StreamWriter("/var/result/result.txt"))
 {
     writer.WriteLine(multiplication);
 }