From 92fa697a66b37bece23211182d94a87694d8953e Mon Sep 17 00:00:00 2001 From: "andreyka.fomichev.2017@mail.ru" Date: Sun, 8 Oct 2023 17:01:18 +0400 Subject: [PATCH 1/4] lab2 ready --- tasks/fomichev-ai/lab_2/.dockerignore | 2 + tasks/fomichev-ai/lab_2/.gitignore | 477 ++++++++++++++++++ tasks/fomichev-ai/lab_2/README.md | 76 +++ tasks/fomichev-ai/lab_2/data/f.txt | 29 ++ .../lab_2/data/fileWithStringData.txt | 3 + .../lab_2/data/incorrectFormatData.json | 19 + tasks/fomichev-ai/lab_2/data/test123456.txt | 5 + tasks/fomichev-ai/lab_2/docker-compose.yml | 18 + tasks/fomichev-ai/lab_2/image1.PNG | Bin 0 -> 19705 bytes tasks/fomichev-ai/lab_2/image2.PNG | Bin 0 -> 20348 bytes tasks/fomichev-ai/lab_2/lab_2.sln | 28 + tasks/fomichev-ai/lab_2/worker-1/Dockerfile | 17 + tasks/fomichev-ai/lab_2/worker-1/Program.cs | 29 ++ .../lab_2/worker-1/worker-1.csproj | 11 + tasks/fomichev-ai/lab_2/worker-2/Dockerfile | 17 + tasks/fomichev-ai/lab_2/worker-2/Program.cs | 24 + .../lab_2/worker-2/worker-2.csproj | 11 + 17 files changed, 766 insertions(+) create mode 100644 tasks/fomichev-ai/lab_2/.dockerignore create mode 100644 tasks/fomichev-ai/lab_2/.gitignore create mode 100644 tasks/fomichev-ai/lab_2/README.md create mode 100644 tasks/fomichev-ai/lab_2/data/f.txt create mode 100644 tasks/fomichev-ai/lab_2/data/fileWithStringData.txt create mode 100644 tasks/fomichev-ai/lab_2/data/incorrectFormatData.json create mode 100644 tasks/fomichev-ai/lab_2/data/test123456.txt create mode 100644 tasks/fomichev-ai/lab_2/docker-compose.yml create mode 100644 tasks/fomichev-ai/lab_2/image1.PNG create mode 100644 tasks/fomichev-ai/lab_2/image2.PNG create mode 100644 tasks/fomichev-ai/lab_2/lab_2.sln create mode 100644 tasks/fomichev-ai/lab_2/worker-1/Dockerfile create mode 100644 tasks/fomichev-ai/lab_2/worker-1/Program.cs create mode 100644 tasks/fomichev-ai/lab_2/worker-1/worker-1.csproj create mode 100644 tasks/fomichev-ai/lab_2/worker-2/Dockerfile create mode 100644 tasks/fomichev-ai/lab_2/worker-2/Program.cs create mode 100644 tasks/fomichev-ai/lab_2/worker-2/worker-2.csproj diff --git a/tasks/fomichev-ai/lab_2/.dockerignore b/tasks/fomichev-ai/lab_2/.dockerignore new file mode 100644 index 0000000..54fec4f --- /dev/null +++ b/tasks/fomichev-ai/lab_2/.dockerignore @@ -0,0 +1,2 @@ +*/*/bin +*/*/obj diff --git a/tasks/fomichev-ai/lab_2/.gitignore b/tasks/fomichev-ai/lab_2/.gitignore new file mode 100644 index 0000000..154e127 --- /dev/null +++ b/tasks/fomichev-ai/lab_2/.gitignore @@ -0,0 +1,477 @@ +## 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/main/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 +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 +*.tlog +*.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 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# 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/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# 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 + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +## +## 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 diff --git a/tasks/fomichev-ai/lab_2/README.md b/tasks/fomichev-ai/lab_2/README.md new file mode 100644 index 0000000..a661355 --- /dev/null +++ b/tasks/fomichev-ai/lab_2/README.md @@ -0,0 +1,76 @@ +# Отчёт по лабораторной работе №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`. + +[Исходный текст программы worker-1](worker-1/Program.cs) + +Согласно варианту программа 2 должна брать строки из папки `/var/data/` с скопированным файлом, пытаться привести их к числам, затем найти минимальное из них. +Далее найти количество вхождений этого числа и результат записать в файл `/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` помещены 4 файла с различной длиной названия и содержимым. +![](image2.PNG) + +На выходе, программа должна записать число 2, так как файл с минимальным названием f.txt, в нём минимальное число -100, которое встречается 2 раза. +![](image1.PNG) + +Для запуска приложения необходимо ввести команду `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 | Сервис 1 отработал успешно! +lab_2-worker-1-1 exited with code 0 +lab_2-worker-2-1 | Сервис 2 отработал успешно! +lab_2-worker-2-1 | Наименьшее число:= -100 , число вхождений:= 2 +lab_2-worker-2-1 exited with code 0 +``` + +В результате в каталоге `./result` создался файл `result.txt` с содержимым `2`, что соответствует входным данным. + +Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`. \ No newline at end of file diff --git a/tasks/fomichev-ai/lab_2/data/f.txt b/tasks/fomichev-ai/lab_2/data/f.txt new file mode 100644 index 0000000..47b1abe --- /dev/null +++ b/tasks/fomichev-ai/lab_2/data/f.txt @@ -0,0 +1,29 @@ +2 +5 +3456 +468 + +24 +3 +67846 +84 +62 + +4 +7468 +23 +34 +67458446 +7 +-100 +735 +35 +7 +24 +6458 +745689 +3 + +3457 +-100 +72346 \ No newline at end of file diff --git a/tasks/fomichev-ai/lab_2/data/fileWithStringData.txt b/tasks/fomichev-ai/lab_2/data/fileWithStringData.txt new file mode 100644 index 0000000..7422b61 --- /dev/null +++ b/tasks/fomichev-ai/lab_2/data/fileWithStringData.txt @@ -0,0 +1,3 @@ +test +test123 +test567 \ No newline at end of file diff --git a/tasks/fomichev-ai/lab_2/data/incorrectFormatData.json b/tasks/fomichev-ai/lab_2/data/incorrectFormatData.json new file mode 100644 index 0000000..5a49499 --- /dev/null +++ b/tasks/fomichev-ai/lab_2/data/incorrectFormatData.json @@ -0,0 +1,19 @@ +{ "menu": + { + "id": "file", + "value": "File", + "popup": { + "menuitem": [ + { + "value": "New", "onclick": "CreateNewDoc()" + }, + { + "value": "Open", "onclick": "OpenDoc()" + }, + { + "value": "Close", "onclick": "CloseDoc()" + } + ] + } + } +} \ No newline at end of file diff --git a/tasks/fomichev-ai/lab_2/data/test123456.txt b/tasks/fomichev-ai/lab_2/data/test123456.txt new file mode 100644 index 0000000..56593e1 --- /dev/null +++ b/tasks/fomichev-ai/lab_2/data/test123456.txt @@ -0,0 +1,5 @@ +5 +6 +7 +8 +9 \ No newline at end of file diff --git a/tasks/fomichev-ai/lab_2/docker-compose.yml b/tasks/fomichev-ai/lab_2/docker-compose.yml new file mode 100644 index 0000000..9c753e7 --- /dev/null +++ b/tasks/fomichev-ai/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/fomichev-ai/lab_2/image1.PNG b/tasks/fomichev-ai/lab_2/image1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..822ce977ed6152c66ee85b344b406f6de798245d GIT binary patch literal 19705 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%0D7u+W)uvtN@?v?* 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 L)la3TJ!1YJZD%5Y literal 0 HcmV?d00001 diff --git a/tasks/fomichev-ai/lab_2/image2.PNG b/tasks/fomichev-ai/lab_2/image2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..54f520ccc5b7cf04b5e714f5dc3278c785e9a881 GIT binary patch literal 20348 zcmbSzcOcdO{{JbPtdt6eM3JJh9mj|w63NQ0kUcVwEi%eDNw#AojxFQZqm!~Z_Kb6~ zIS%L8sI0N}P6|ha`^1#py1Y&CW{qIzp zbDkv#q{XUs@2)P)j4Atb<~4>lr@R zwpcy1KPag6Q7x|jJ<0ZK18GPExtb1696b-EQ00#8e@lh--@Xh3xu-5ySgW604Jo&5 zxi2d1mzCzbe0Di`lCx+sDuGhV84F!z{J7|2WoAx@9C7K7jcytV!JP^kNs%ZWrR*(_ z?cy>TDInV3B^D);EClA3l=;qoLmH@Di|KlsO=Icr5_pb@Vd0_x6INuj)HuP>AiH^e zh(0}Q7Tyka&h_jHx^8}zvqDtrqelDZ!w+9x1zT@ML>aZcS)ov@Pw_ku7po&F3*=;H z+79MY!5#0}=T7*j&XH!bh;Nk_QG)I&J_OfMit17cK7>kJqJw$-1XmyN!`&6dsqYMdU>Jd|xGhhjqZF-q(Yaim6O68hVy3*dg ztj)gul&tKLGs5&?4<&Y|{O&X4PO#t0{=^T{pv}qtWWojId$~1NsgorSs=UE?o-y(9 zQeOTAs1SVy$)fcBFEOEPk1)*@!s7ZFYK^NIJoQZ-xc)C{xouJWF!zj@7aE4#g5&N+ zHtuYB%pig~a)RAN^x_$?Rqn(mNR|a>{{&9^nqQMez+k?V`w(&sd-hC{`n1nl@3mk7 zCWJ#>H#g~N+t{GZvTkaX4#|rvcM9ZA+xR+@(MiN6IyEejh9Wnmlq*aO#`JlI zuIEbV6sE4+wkvI3U9IllEfS5Nf24ss33z>9UdmPS2Pt~!T!Rgj;KMjv2`QT)1P~~< z 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 + + + Exe + net7.0 + worker_1 + enable + enable + + + diff --git a/tasks/fomichev-ai/lab_2/worker-2/Dockerfile b/tasks/fomichev-ai/lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..0ea2530 --- /dev/null +++ b/tasks/fomichev-ai/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/fomichev-ai/lab_2/worker-2/Program.cs b/tasks/fomichev-ai/lab_2/worker-2/Program.cs new file mode 100644 index 0000000..84c6649 --- /dev/null +++ b/tasks/fomichev-ai/lab_2/worker-2/Program.cs @@ -0,0 +1,24 @@ +var dir = new DirectoryInfo("../var/data"); +var fileName = dir.GetFiles().First().Name; +string[] numbers = File.ReadAllLines("/var/data/" + fileName); +long k = 0; +long min = long.MaxValue; +foreach (var numberStr in numbers) +{ + if (!int.TryParse(numberStr, out int number)) + continue; + if (number < min) + min = number; +} + +foreach (var numberStr in numbers) +{ + if (!int.TryParse(numberStr, out int number)) + continue; + if (min == number) + k++; +} + +File.WriteAllText("/var/result/result.txt", k.ToString()); +Console.WriteLine("Сервис 2 отработал успешно!"); +Console.WriteLine($"Наименьшее число:= {min} , число вхождений:= {k}"); \ No newline at end of file diff --git a/tasks/fomichev-ai/lab_2/worker-2/worker-2.csproj b/tasks/fomichev-ai/lab_2/worker-2/worker-2.csproj new file mode 100644 index 0000000..b90f9cb --- /dev/null +++ b/tasks/fomichev-ai/lab_2/worker-2/worker-2.csproj @@ -0,0 +1,11 @@ + + + + Exe + net7.0 + worker_2 + enable + enable + + + From 4d92918dd9559937cc4a6225fe7aad3640969f6e Mon Sep 17 00:00:00 2001 From: "andreyka.fomichev.2017@mail.ru" Date: Sun, 8 Oct 2023 17:03:28 +0400 Subject: [PATCH 2/4] fix image --- tasks/fomichev-ai/lab_2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/fomichev-ai/lab_2/README.md b/tasks/fomichev-ai/lab_2/README.md index a661355..d60b8f2 100644 --- a/tasks/fomichev-ai/lab_2/README.md +++ b/tasks/fomichev-ai/lab_2/README.md @@ -51,6 +51,7 @@ dotnet new console -o worker-2 ## Сборка и запуск В каталог `./data` помещены 4 файла с различной длиной названия и содержимым. + ![](image2.PNG) На выходе, программа должна записать число 2, так как файл с минимальным названием f.txt, в нём минимальное число -100, которое встречается 2 раза. From 58e067c6a06ea80d484dfbafe53cffa29e97b8c2 Mon Sep 17 00:00:00 2001 From: "andreyka.fomichev.2017@mail.ru" Date: Tue, 10 Oct 2023 23:28:43 +0400 Subject: [PATCH 3/4] edit comment --- tasks/fomichev-ai/lab_2/worker-1/Dockerfile | 10 +++++----- tasks/fomichev-ai/lab_2/worker-2/Dockerfile | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tasks/fomichev-ai/lab_2/worker-1/Dockerfile b/tasks/fomichev-ai/lab_2/worker-1/Dockerfile index 25c9cc8..9e76699 100644 --- a/tasks/fomichev-ai/lab_2/worker-1/Dockerfile +++ b/tasks/fomichev-ai/lab_2/worker-1/Dockerfile @@ -1,11 +1,11 @@ -#задаем базовый образ на .net 6.0 +# Задаем базовый образ на .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 @@ -13,5 +13,5 @@ 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/fomichev-ai/lab_2/worker-2/Dockerfile b/tasks/fomichev-ai/lab_2/worker-2/Dockerfile index 0ea2530..4c544d1 100644 --- a/tasks/fomichev-ai/lab_2/worker-2/Dockerfile +++ b/tasks/fomichev-ai/lab_2/worker-2/Dockerfile @@ -1,11 +1,11 @@ -#задаем базовый образ на .net 6.0 +# Задаем базовый образ на .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 @@ -13,5 +13,5 @@ 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 From 9540fb503e470c554675f7f2d5e4030c36688865 Mon Sep 17 00:00:00 2001 From: "andreyka.fomichev.2017@mail.ru" Date: Mon, 16 Oct 2023 21:25:24 +0400 Subject: [PATCH 4/4] fix after review --- tasks/fomichev-ai/lab_2/README.md | 2 +- tasks/fomichev-ai/lab_2/worker-1/Program.cs | 4 ++-- tasks/fomichev-ai/lab_2/worker-2/Program.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/fomichev-ai/lab_2/README.md b/tasks/fomichev-ai/lab_2/README.md index d60b8f2..a491319 100644 --- a/tasks/fomichev-ai/lab_2/README.md +++ b/tasks/fomichev-ai/lab_2/README.md @@ -42,7 +42,7 @@ dotnet new console -o worker-2 4. Каталог `./result` должен быть примонтирован в каталог `/var/result` для программы 2. Туда будут складывать результаты финальной обработки. -Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-1/Dockerfile)) с подробным описанием процесса сборки. +Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-2/Dockerfile)) с подробным описанием процесса сборки. Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения. diff --git a/tasks/fomichev-ai/lab_2/worker-1/Program.cs b/tasks/fomichev-ai/lab_2/worker-1/Program.cs index 0d253b2..44d90d5 100644 --- a/tasks/fomichev-ai/lab_2/worker-1/Program.cs +++ b/tasks/fomichev-ai/lab_2/worker-1/Program.cs @@ -1,7 +1,7 @@ -var dir = new DirectoryInfo("../var/data"); +var dir = new DirectoryInfo("/var/data"); var files = dir.GetFiles(); string? oldFilePath = null; -var newFilePathTest = new DirectoryInfo("../var/result"); +var newFilePathTest = new DirectoryInfo("/var/result"); string? fileName = null; long minFileName = long.MaxValue; diff --git a/tasks/fomichev-ai/lab_2/worker-2/Program.cs b/tasks/fomichev-ai/lab_2/worker-2/Program.cs index 84c6649..f9940ad 100644 --- a/tasks/fomichev-ai/lab_2/worker-2/Program.cs +++ b/tasks/fomichev-ai/lab_2/worker-2/Program.cs @@ -1,4 +1,4 @@ -var dir = new DirectoryInfo("../var/data"); +var dir = new DirectoryInfo("/var/data"); var fileName = dir.GetFiles().First().Name; string[] numbers = File.ReadAllLines("/var/data/" + fileName); long k = 0;