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 файла с различной длиной названия. + + + +На выходе, программа должна сначала записать числа [5 8 9], поскольку именно такую длину имеют файлы (вместе с расширением). А затем, умножив 5 на 9, получится результат программы 2, равный 45 + +Для запуска приложения необходимо ввести команду `docker compose up --build`. +Результат запуска после сборки: + + + +В результате в каталоге `./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); }