Compare commits

..

No commits in common. "main" and "alexandrov_dmitrii_lab_4" have entirely different histories.

1682 changed files with 0 additions and 47536 deletions

View File

@ -1,27 +0,0 @@
version: '3.8'
services:
usr_service:
build:
context: /user_service
dockerfile: Dockerfile
depends_on:
- msg_service
expose:
- 8082
msg_service:
build:
context: /message_service
dockerfile: Dockerfile
expose:
- 8081
nginx:
image: nginx
ports:
- 8086:8086
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- msg_service
- usr_service

View File

@ -1,11 +0,0 @@
FROM python:3.9
EXPOSE 8081
RUN pip install Flask requests
WORKDIR /work
COPY msg_service.py ./
CMD ["python", "msg_service.py"]

View File

@ -1,50 +0,0 @@
from flask import Flask, jsonify, request, Response
from datetime import datetime
app = Flask(__name__)
msgs = {0: {'id': 0, 'from': 0, 'to': 1, 'body': 'qq', 'dt': datetime(2023, 12, 22, 8, 0)},
1: {'id': 1, 'from': 1, 'to': 0, 'body': 'qq', 'dt': datetime(2023, 12, 22, 8, 5)},
2: {'id': 2, 'from': 0, 'to': 1, 'body': 'bye', 'dt': datetime(2023, 12, 22, 8, 10)},
3: {'id': 3, 'from': 1, 'to': 1, 'body': 'bye', 'dt': datetime(2023, 12, 22, 8, 15)}}
@app.route('/', methods=['GET', 'POST'])
def get_all():
if request.method == 'POST':
dto = request.get_json()['dto']
new_id = max(msgs.keys()) + 1
msgs[new_id] = {
'id': new_id,
'from': dto['from'],
'to': dto['to'],
'body': dto['body'],
'dt': datetime.now()
}
return jsonify(msgs[new_id])
return jsonify(msgs)
@app.route('/<int:msg_id>', methods=['GET', 'PUT', 'DELETE'])
def get_by_id(msg_id):
if msg_id not in msgs.keys():
return Response(status=404)
if request.method == 'PUT':
dto = request.get_json()['dto']
msgs[msg_id] = {
'from': dto['from'],
'to': dto['to'],
'body': dto['body'],
'dt': datetime.now()
}
return msgs[msg_id]
elif request.method == 'DELETE':
msgs.pop(msg_id)
return Response(status=200)
return jsonify(msgs[msg_id])
if __name__ == '__main__':
app.run(host='0.0.0.0', use_reloader=False, port=8081)

View File

@ -1,27 +0,0 @@
events {
worker_connections 1024;
}
http {
server {
listen 8086;
listen [::]:8086;
server_name localhost;
location /msg_service/ {
proxy_pass http://msg_service:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Prefix $scheme;
}
location /usr_service/ {
proxy_pass http://usr_service:8082/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Prefix $scheme;
}
}
}

View File

@ -1,32 +0,0 @@
## Задание
1. Создать 2 микросервиса, реализующих CRUD на связанных сущностях.
2. Реализовать механизм синхронного обмена сообщениями между микросервисами.
3. Реализовать шлюз на основе прозрачного прокси-сервера nginx.
Вариант: сообщения и пользователи
## Выполнение
Были написаны два сервиса на языке python с технологией flask:
* Сервис msg_service, хранящий данные о сообщениях и реализующий CRUD операции с ними через HTTP запросы.
* Сервис usr_service, хранящий данные о пользователях и реализующий CRUD операции с ними через HTTP запросы.
Сервисы синхронно сообщены - сервис пользователей запрашивает данные у сервиса сообщений для получения сообщений пользователя.
Для сервисов прописаны файлы Dockerfile, описывающие создание контейнеров:
* Для обоих контейнеров выбирается Python 3.9.
* Оба контейнера проявляют порты, на которых работает приложение: 8081 для сообщений и 8082 для пользователей.
* В оба контейнера устанавливаются пакеты Flask и requests.
* Выбирается рабочая директория /work и туда копируются файлы скриптов.
* Командой запускаются сами скрипты.
Общий yaml-файл развёртки был настроен следующим образом:
* блок services, где перечислены разворачиваемые сервисы.
* для каждого сервиса прописан build, где объявляется его папка и докерфайл создания и зависимости.
* для сервиса nginx прописан порт для отображения вовне.
## Результат
Демонстрация работы в видео.
## Ссылка на видео
https://drive.google.com/file/d/1gmZsbzMmC34Uidi4u_D3nFyPAG0MuPAf/view?usp=drive_link

View File

@ -1,11 +0,0 @@
FROM python:3.9
EXPOSE 8082
RUN pip install Flask requests
WORKDIR /work
COPY usr_service.py ./
CMD ["python", "usr_service.py"]

View File

@ -1,56 +0,0 @@
import requests
from flask import Flask, jsonify, request, Response
app = Flask(__name__)
usrs = {0: {'id': 0, 'name': 'anton', 'role': 'admin', 'online': False, 'msgs_sent': [0, 2], 'msgs_got': [1, 3]},
1: {'id': 1, 'name': 'lioha', 'role': 'user', 'online': False, 'msgs_sent': [1, 3], 'msgs_got': [0, 2]}}
@app.route('/', methods=['GET', 'POST'])
def get_all():
if request.method == 'POST':
dto = request.get_json()['dto']
new_id = max(usrs.keys()) + 1
usrs[new_id] = {
'id': new_id,
'name': dto['name'],
'role': dto['role'],
'online': dto['online']
}
return jsonify(usrs[new_id])
return jsonify(usrs)
@app.route('/<int:usr_id>', methods=['GET', 'PUT', 'DELETE'])
def get_by_id(usr_id):
if usr_id not in usrs.keys():
return Response(status=404)
if request.method == 'PUT':
dto = request.get_json()['dto']
usrs[usr_id] = {
'name': dto['name'],
'role': dto['role'],
'online': dto['online']
}
return usrs[usr_id]
elif request.method == 'DELETE':
usrs.pop(usr_id)
return Response(status=200)
usr = usrs[usr_id]
msgs = []
for msg_id in usr['msgs_sent']:
msgs.append(requests.get("http://msg_service:8081/"+str(msg_id)).json())
usr['msgs_sent'] = msgs
msgs.clear()
for msg_id in usr['msgs_got']:
msgs.append(requests.get("http://msg_service:8081/"+str(msg_id)).json())
usr['msgs_got'] = msgs
return jsonify(usr)
if __name__ == '__main__':
app.run(host='0.0.0.0', use_reloader=False, port=8082)

View File

@ -1,109 +0,0 @@
import numpy as np
import time
from concurrent.futures import ProcessPoolExecutor
benchmark = {}
m_a = []
m_b = []
m_c = []
# лучше не надо
def do_multiplication(size):
global m_a
global m_b
global m_c
m_a = np.random.randint(10, size=(size, size))
m_b = np.random.randint(10, size=(size, size))
m_c = np.zeros(shape=(size, size))
bt = m_b.transpose()
start_time = time.time()
for i in range(size):
for j in range(size):
for k in range(size):
m_c[i][j] = m_c[i][j] + m_a[i][k] * bt[j][k]
return time.time() - start_time
def multiply_row(a, bt, c, size):
for j in range(size):
c[j] = sum(el_a * el_b for el_a, el_b in zip(a, bt[j]))
return c
def do_multiplication_parallel(size, proc_num):
global m_a
global m_b
global m_c
if proc_num > 61:
proc_num = 61
m_a = np.random.randint(10, size=(size, size))
m_b = np.random.randint(10, size=(size, size))
m_c = np.zeros(shape=(size, size))
bt = m_b.transpose()
start_time = time.time()
with ProcessPoolExecutor(max_workers=proc_num) as executor:
results = [executor.submit(multiply_row, m_a[i], bt, m_c[i], size) for i in range(size)]
m_c = [future.result() for future in results]
return time.time() - start_time
def do_research():
benchmark['size=100, proc_num=1: '] = do_multiplication_parallel(100, 1)
benchmark['size=300, proc_num=1: '] = do_multiplication_parallel(300, 1)
benchmark['size=500, proc_num=1: '] = do_multiplication_parallel(500, 1)
benchmark['size=100, proc_num=10: '] = do_multiplication_parallel(100, 10)
benchmark['size=300, proc_num=10: '] = do_multiplication_parallel(300, 10)
benchmark['size=500, proc_num=10: '] = do_multiplication_parallel(500, 10)
benchmark['size=100, proc_num=100: '] = do_multiplication_parallel(100, 100)
benchmark['size=300, proc_num=100: '] = do_multiplication_parallel(300, 100)
benchmark['size=500, proc_num=100: '] = do_multiplication_parallel(500, 100)
print(benchmark)
if __name__ == '__main__':
do_research()
def get_results(size, proc_num):
global m_a
global m_b
global m_c
res = "time: "
res = res + str(do_multiplication_parallel(size, proc_num))
res = res + "<br/>"
for i in range(size):
res = res + "<p>"
for a in range(size):
res = res + str(m_a[i][a]) + ", "
res = res + "&emsp;"
for b in range(size):
res = res + str(m_b[i][b]) + ", "
res = res + "&emsp;"
for c in range(size):
res = res + str(m_c[i][c]) + ", "
res = res + "</p>"
return res
def get_benchmark():
global benchmark
if len(benchmark) == 0:
do_research()
res = ''
for key, val in benchmark.items():
res = res + "<p>" + key + str(val) + "</p>"
return res

View File

@ -1,37 +0,0 @@
## Задание
Создать программу, производящую параллельные умножения реализовать двух больших квадратных матриц.
## Выполнение
Программа состоит из модуля-сервиса service и модуля для вычислений matrix.
В модуле для вычислений реализовано:
* метод do_multiplication, который в обычном режиме одним потоком умножает матрицы. Не используется, т.к. слишком медленный.
* метод multiply_row, который получает строку матрицы A, транспонированную матрицу B, строку выходной матрицы C, размер матриц и заполняет эту строку проходя по строкам транспонированной матрицы B. Возвращает заполненную строку.
* метод do_multiplication_parallel, использующий предыдущий, который получает размер матриц и количество процессов, генерирует случайные матрицы заданного размера и производит вычисления.
* метод прогона эксперимента с заполнением данных результатами. Методы интерфейса доступа.
Способ вычисления: в методе do_multiplication_parallel матрица B транспонируется, создаётся объект ProcessPoolExecutor с переданным количеством процессов, который их создаёт и распределяет по ним строки вычисляемой матрицы, а именно передавая им метод multiply_row.
Если передать методу число 1 в качестве количества процессов, то соответственно вычисление произойдёт в одном потоке.
## Результаты
Был создан Flask сервис, позволяющий получать результаты умножения случайных квадратных матриц.
Возможно задать размер и количество процессов.
Дополнительно возможно провести эксперимент и получить результаты умножения матриц размера 100, 300 и 500 одним, десятью и ста процессами.
Поскольку распараллеливание основано на процессах, а в системе имеется 6 ядер (+2 виртуальных), то максимальное увеличение производительности будет достигнуто при выборе такого количества процессов.
Более 61 потока урезается до 61 из-за системных ограничений.
Как видно из бенчмарка:
* во всех случаях скорость максимальна при выборе 10 процессов, т.е. при ближайшем к 8 числу процессов.
* в случае 100 процессов из-за издержек создания процессов малые матрицы обрабатываются на порядок дольше, нежели одним процессом.
* в случае 100 процессов благодаря распараллеливанию скорость обработки оказалась в 3 раза выше скорости обработки одним процессом.
Результаты:
![matrix5x5](screens/get5.png)
![matrix15x15](screens/get15.png)
Бенчмарк:
![bench](screens/bench.png)
## Ссылка на видео
https://drive.google.com/file/d/1_bIyLL8YGwDePwWdCFk4KxntJip6mP0t/view?usp=drive_link

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,35 +0,0 @@
from flask import Flask, redirect, request, render_template
import matrix
app = Flask(__name__, template_folder='')
results = ''
@app.route('/')
def home():
global results
return render_template("template.html", results_html=results)
@app.route('/do')
def do():
global results
data = request.args
results = matrix.get_results(int(data['size']), int(data['proc_num']))
return redirect("/")
@app.route('/benchmark')
def benchmark():
global results
results = matrix.get_benchmark()
return redirect("/")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8082)

View File

@ -1,18 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Matrix</title>
</head>
<body>
<form action="http://127.0.0.1:8082/do">
<input type="number" id="size" name="size" value="5">
<input type="number" id="proc_num" name="proc_num" value="1">
<input align="center" type="submit" value="Выполнить"/>
</form>
<form action="http://127.0.0.1:8082/benchmark">
<input align="center" type="submit" value="Вывести бенчмарк"/>
</form>
{{results_html|safe}}
</body>
</html>

View File

@ -1,109 +0,0 @@
import numpy as np
import time
from concurrent.futures import ProcessPoolExecutor
benchmark = {}
matrix = []
# int переполняется
det = 0.0
# ручной метод - от размера матриц ~15 и выше может случайно винду
def get_determinant_usr_implementation(input_m):
if input_m.size == 4:
return input_m[0, 0] * input_m[1, 1] - input_m[0, 1] * input_m[1, 0]
r_det = [0] * input_m.size
for i in range(input_m.shape[0]):
r_det[i] = input_m[0, i]
if r_det[i] != 0:
if i % 2 == 1:
r_det[i] = r_det[i] * -1
r_det[i] = r_det[i] * get_determinant_usr_implementation(
np.delete(np.delete(input_m, 0, axis=0), i, axis=1))
return sum(r_det)
def get_determinant_component_usr_implementation(input_m, col):
r_det = float(input_m[0, col])
if r_det == 0:
return r_det
if col % 2 == 1:
r_det = r_det * -1
return r_det * get_determinant_usr_implementation(np.delete(np.delete(input_m, 0, axis=0), col, axis=1))
def get_determinant_component(input_m, col):
r_det = float(input_m[0, col])
if r_det == 0:
return r_det
if col % 2 == 1:
r_det = r_det * -1
return r_det * np.linalg.det(np.delete(np.delete(input_m, 0, axis=0), col, axis=1))
def calculate_determinant_parallel(size, proc_num):
global matrix
global det
if proc_num > 61:
proc_num = 61
matrix = np.random.randint(10, size=(size, size))
start_time = time.time()
with ProcessPoolExecutor(max_workers=proc_num) as executor:
if size <= 10:
components = [executor.submit(get_determinant_component_usr_implementation, matrix, i) for i in range(size)]
else:
components = [executor.submit(get_determinant_component, matrix, i) for i in range(size)]
res = [fut.result() for fut in components]
det = sum(res)
return time.time() - start_time
def do_research():
benchmark['size=2, proc_num=1: '] = calculate_determinant_parallel(2, 1)
benchmark['size=5, proc_num=1: '] = calculate_determinant_parallel(5, 1)
benchmark['size=10, proc_num=1: '] = calculate_determinant_parallel(10, 1)
benchmark['size=2, proc_num=10: '] = calculate_determinant_parallel(2, 10)
benchmark['size=5, proc_num=10: '] = calculate_determinant_parallel(5, 10)
benchmark['size=10, proc_num=10: '] = calculate_determinant_parallel(10, 10)
benchmark['size=2, proc_num=100: '] = calculate_determinant_parallel(2, 100)
benchmark['size=5, proc_num=100: '] = calculate_determinant_parallel(5, 100)
benchmark['size=10, proc_num=100: '] = calculate_determinant_parallel(10, 100)
print(benchmark)
if __name__ == '__main__':
do_research()
def get_results(size, proc_num):
global matrix
global det
res = "time: "
res = res + str(calculate_determinant_parallel(size, proc_num))
res = res + "<br/>"
for i in range(size):
res = res + "<p>"
for a in range(size):
res = res + str(matrix[i][a]) + ", "
res = res + "</p>"
res = res + "<br/><p>" + str(det) + "</p>"
return res
def get_benchmark():
global benchmark
if len(benchmark) == 0:
do_research()
res = ''
for key, val in benchmark.items():
res = res + "<p>" + key + str(val) + "</p>"
return res

View File

@ -1,42 +0,0 @@
## Задание
Создать программу, производящую поиск детерминанта больших квадратных матриц.
## Выполнение
Программа состоит из модуля-сервиса service и модуля для вычислений matrix.
В модуле для вычислений реализовано:
* метод get_determinant_usr_implementation. "Вручную" ищет детерминант переданной матрицы.
* метод get_determinant_component_usr_implementation. Ищет минорный детерминант, используя "ручной" метод, для реализации распараллеливания.
* метод get_determinant_component. Ищет минорный детерминант, используя библиотечный метод для поиска детерминантов миноров, для распараллеливания.
* метод calculate_determinant_parallel. Генерирует случайные матрицы заданного размера и производит параллельные вычисления предыдущими методами в зависимости от размера (если размер больше 10 использовать ручной метод лучше не надо, можно случайно компьютер).
* метод прогона эксперимента с заполнением данных результатами. Методы интерфейса доступа.
Способ вычисления: в методе do_multiplication_parallel матрица B транспонируется, создаётся объект ProcessPoolExecutor с переданным количеством процессов, который их создаёт и распределяет по ним вычисление минорных детерминантов первой строки для последующего сложения, в зависимости от размера матрицы используется get_determinant_component_usr_implementation или get_determinant_component.
Если передать методу число 1 в качестве количества процессов, то соответственно вычисление произойдёт в одном потоке.
## Результаты
Был создан Flask сервис, позволяющий получать детерминанты случайных квадратных матриц.
Возможно задать размер и количество процессов.
Дополнительно возможно провести эксперимент и получить результаты умножения матриц размера 2, 5 и 10 одним, десятью и ста процессами.
Для создания бенчмарка был сокращён размер матриц, поскольку:
* ручной метод не может в обозримом будущем посчитать матрицу размером больше 15-20.
* библиотечный метод считает детерминант за секунду-две без заметных изменений от увеличения количества процессов обработки. анализировать результаты не получится (разве что заключить, что метод не нуждается в распараллеливании).
Поскольку распараллеливание основано на процессах, а в системе имеется 6 ядер (+2 виртуальных), то максимальное увеличение производительности будет достигнуто при выборе такого количества процессов.
Более 61 потока урезается до 61 из-за системных ограничений.
Как видно из бенчмарка:
* в случае больших размеров скорость максимальна при выборе 100 (61) процессов, можно заключить, что алгоритм "ручной" алгоритм хорошо реагирует на распараллеливание.
* в случае 100 процессов из-за издержек создания процессов малые матрицы обрабатываются на порядок дольше, нежели одним процессом.
* в случае 100 процессов благодаря распараллеливанию скорость обработки матрицы размером 10 оказалась в 5 раз выше скорости обработки одним процессом.
Результаты:
![matrix5x5](screens/5x5.png)
![matrix30x30](screens/30x30.png)
Бенчмарк:
![bench](screens/bench.png)
## Ссылка на видео
https://drive.google.com/file/d/1kxMccJDCQsVK1qcrsiQKDXUuDzPQ1Lsc/view?usp=drive_link

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

View File

@ -1,35 +0,0 @@
from flask import Flask, redirect, request, render_template
import matrix
app = Flask(__name__, template_folder='')
results = ''
@app.route('/')
def home():
global results
return render_template("template.html", results_html=results)
@app.route('/do')
def do():
global results
data = request.args
results = matrix.get_results(int(data['size']), int(data['proc_num']))
return redirect("/")
@app.route('/benchmark')
def benchmark():
global results
results = matrix.get_benchmark()
return redirect("/")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8082)

View File

@ -1,18 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Matrix</title>
</head>
<body>
<form action="http://127.0.0.1:8082/do">
<input type="number" id="size" name="size" value="5">
<input type="number" id="proc_num" name="proc_num" value="1">
<input align="center" type="submit" value="Выполнить"/>
</form>
<form action="http://127.0.0.1:8082/benchmark">
<input align="center" type="submit" value="Вывести бенчмарк"/>
</form>
{{results_html|safe}}
</body>
</html>

View File

@ -1,20 +0,0 @@
## Задание
Балансировка нагрузки в распределённых системах при помощи открытых технологий на примерах.
Написать небольшое эссе (буквально несколько абзацев) своими словами (пожалуйста не пользуйтесь гуглом :). А помогут Вам в этом вопросы из списка:
1. Какие алгоритмы и методы используются для балансировки нагрузки?
2. Какие открытые технологии существуют для балансировки нагрузки?
3. Как осуществляется балансировка нагрузки на базах данных?
4. Реверс-прокси как один из элементов балансировки нагрузки.
## Результат
Балансировка нагрузки - это управление распределением траффика между несколькими сервисами, системными компонентами. Необходимо для повышения надёжности и производительности системы.
Для балансировки нагрузки используются следующие методы: последовательная циклическая передача запросов по списку обработчиков, передача запросов в наименее загруженный обработчик, либо также, но с учётом его вместимости, передача запросов в обработчик с наименьшим временем отклика, передача запросов от одного источника одному серверу с обработчиками.
Для балансировки могут использоваться программы: прокси-сервера, например Nginx, в современных системах развёртки они могут быть "встроены" (Azure). Балансировка может быть реализована также на аппаратном уровне сетевых устройств, предоставляться облачными сервисами.
Для БД также есть прокси (PL/Proxy), на уровне серверов СУБД могут распределяться таблицы (по серверам) одной БД, либо даже расщепляться и распределяться отдельные таблицы. Вообще многое управление может быть решено на уровне выше СУБД - в приложениях, существуют специализированные приложения для синхронной и асинхронной работы с БД, в том числе такие, которые осуществляют распределение запросов.
Обратное прокси - это прокси, который работает вовнутрь системы. То есть, он ретранслирует запросы из внешней сети на подключённые сервера внутренней. Как элемент распределения нагрузки он важен, так как является тем узлом системы, через который будут проходить запросы, которые необходимо распределять. Соответственно многие решения реализуются на уровне прокси-серверов.

View File

@ -1,32 +0,0 @@
## Задание
Написать небольшое эссе (буквально несколько абзацев) своими словами (пожалуйста не пользуйтесь гуглом :) ) на тему "Устройство распределенных систем". А помогут Вам в этом вопросы из списка:
* Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
* Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
* Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
* Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
* Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.
## Эссе
Распределённые системы - это ещё одно проявление тенденции к дроблению процессов и структур. Такое уже проявилось в проектировании, конструировании и т.д.
Здесь оно проявляется в программных системах. Вызвано это, во-первых, качественным ростом навыков и инструментов разработки, что открыло технический и гносеологический доступ к более сложным системам и технологиям для их освоения, во-вторых, ростом размера систем и запросов к ним, соответственно появление нужды в сложных больших системах.
Распределённые системы - это системы, состоящие из множества размещённых независимо программ, вместе исполняющих общую функциональность.
Для сложных, особенно сетевых, систем это означает удобные развёртывание и масштабирование: можно развернуть множество узлов, распределить по ним функционал, при необходимости легко заменить, переместить или дублировать какую-то часть функционала.
Также это означает большую надёжность: если сломается какой-то узкоспециализированный сервис, остальной функционал продолжит работу.
Для большего дробления и лучшей организации были созданы системы оркестрации приложений - системы, которые создают множество контейнеров или иных отделённых специализированных микросред для сервисов и программ для оптимизации их работы и централизованного ими управления.
С другой стороны, они позволяют интегрировать системы через сеть, объединяя такие среды с разных машин в единую среду для работы одной программной системы.
Они как упрощают разработку, позволяя организовать её через сеть, тестировать распределённые по микросредам систему, упрощают сопровождение, так как предоставляют удобное управление своими узлами и средами.
В то же время они создают ещё один слой разработки и проектирования, требуют дополнительных ресурсов.
Очереди обработки сообщений нужны для организации асинхронного взаимодействия частей распределённых приложений, они выделить в отдельный слой всю информацию о связях сервисов. Сообщения могут быть чем угодно - командами, данными, любой нужной сервисам от других сервисов информацией.
Выделение этого слоя позволяет снизить связность сервисов, что является одной из причин распределения.
Примущества распределённых систем в удобстве развёртки и распределения разработки. Недостатки в требовательности к координации, сильном усложнении используемых инструментов и технологий.
В сложную распределённую систему может быть как целесообразно, так и нецелесообразно внедрять параллельные вычисления. Для распределённых систем оно будет более целесообразным, так как распределённость сама по себе подразумевает некоторую параллельность.
В общем случае, технологии внедряются по необходимости: когда достигнут предел (скорее всего временной) возможностей последовательной обработки отдельной машиной. Для распределённых же систем распараллеливание будет более естественным процессом, благодаря средствам развёртки, таким как системы оркестрации, становится удобным создавать большие вычислительные сети.
Тем не менее, в таком случае может оказаться, что вычислительные мощности излишни для задач, которые не может решить отдельная машина. Параллельная обработка нужна только для незаурядных по объёмам или временным рамкам задач: например для научных вычислений, для оперирования большими объёмами информации, обучения больших машинных сетей. Это задачи, с которыми одна машина не может адекватно справиться.

View File

@ -1,32 +0,0 @@
# Используем образ .NET Runtime как базовый образ для нашего контейнера
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
# Устанавливаем рабочую директорию в контейнере
WORKDIR /app
# Используем образ .NET SDK для сборки и публикации приложения
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
# Устанавливаем рабочую директорию для сборки
WORKDIR /src
# Копируем файл проекта в контейнер и восстанавливаем зависимости
COPY ["Part1.csproj", "."]
RUN dotnet restore "./Part1.csproj"
# Копируем все остальные файлы проекта в контейнер
COPY . .
# Устанавливаем рабочую директорию
WORKDIR "/src/."
# Собираем проект с конфигурацией Release
RUN dotnet build "Part1.csproj" -c Release -o /app/build
# Создаем стадию публикации на основе сборки
FROM build AS publish
# Публикуем проект с конфигурацией Release
RUN dotnet publish "Part1.csproj" -c Release -o /app/publish /p:UseAppHost=false
# Создаем финальный образ на основе базового образа .NET Runtime
FROM base AS final
# Устанавливаем рабочую директорию в контейнере
WORKDIR /app
# Копируем опубликованные файлы из стадии publish
COPY --from=publish /app/publish .
# Задаем точку входа для контейнера
ENTRYPOINT ["dotnet", "Part1.dll"]

View File

@ -1,16 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>.</DockerfileContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
</ItemGroup>
</Project>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ActiveDebugProfile>Docker</ActiveDebugProfile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>

View File

@ -1,25 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.7.34018.315
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Part1", "Part1.csproj", "{580DE38F-6CC0-4B13-A1CA-10AFD2316A7E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{580DE38F-6CC0-4B13-A1CA-10AFD2316A7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{580DE38F-6CC0-4B13-A1CA-10AFD2316A7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{580DE38F-6CC0-4B13-A1CA-10AFD2316A7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{580DE38F-6CC0-4B13-A1CA-10AFD2316A7E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C15D9C92-B603-4D55-B53A-D42F2092B83B}
EndGlobalSection
EndGlobal

View File

@ -1,55 +0,0 @@
var directoryPath = Environment.GetEnvironmentVariable("APP_DIR");
if (directoryPath == null)
{
Console.WriteLine("Не найден переменная среды адреса");
return;
}
var inputFilesPath = Path.Combine(directoryPath, "data");
var outputFilePath = Path.Combine(directoryPath, "result");
Console.WriteLine($"Входная папка: {inputFilesPath}");
Console.WriteLine($"Выходная папка: {outputFilePath}");
try
{
if (Directory.Exists(inputFilesPath))
{
var files = Directory.GetFiles(inputFilesPath);
if (files.Length > 0)
{
var fileWithMostLines = files
.Select(filePath => new { FilePath = filePath, LineCount = File.ReadLines(filePath).Count() })
.OrderByDescending(x => x.LineCount)
.First();
Console.WriteLine($"Файл с наибольшим количеством строк: {fileWithMostLines.FilePath}");
Console.WriteLine($"Количество строк в файле: {fileWithMostLines.LineCount}");
string outputFileName = "inputFileFor2Program.txt";
string outputFilePathWithFileName = Path.Combine(outputFilePath, outputFileName);
if (File.Exists(outputFilePathWithFileName))
{
Console.WriteLine($"Файл {outputFilePathWithFileName} уже существует удалим его");
File.Delete(outputFilePathWithFileName);
}
File.Copy(fileWithMostLines.FilePath, outputFilePathWithFileName);
Console.WriteLine($"Файл перемещен в {outputFilePathWithFileName}");
}
else
{
Console.WriteLine("В директории нет файлов.");
}
}
else
{
Console.WriteLine("Указанной директории не существует.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

View File

@ -1,10 +0,0 @@
{
"profiles": {
"Part1": {
"commandName": "Project"
},
"Docker": {
"commandName": "Docker"
}
}
}

View File

@ -1,34 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"Part1/1.0.0": {
"dependencies": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets": "1.19.4"
},
"runtime": {
"Part1.dll": {}
}
},
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.19.4": {}
}
},
"libraries": {
"Part1/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.19.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aKxpRAUIxDrnSnyr7xJWGixOBgsB7Z4oHpWRkpRzzq04kfze4mN7944gRc4X9H2U5KG3A/btF74kavkO8KXqCg==",
"path": "microsoft.visualstudio.azure.containers.tools.targets/1.19.4",
"hashPath": "microsoft.visualstudio.azure.containers.tools.targets.1.19.4.nupkg.sha512"
}
}
}

View File

@ -1,9 +0,0 @@
{
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
}
}
}

View File

@ -1 +0,0 @@
/app/bin/Debug/net6.0/Part1.dll

View File

@ -1 +0,0 @@
--additionalProbingPath /.nuget/fallbackpackages

View File

@ -1 +0,0 @@
0e4a486e8d81d00f192d2816ae8892d1536fbf86ae98681bec683af12578939b

View File

@ -1 +0,0 @@
TTrD3JA/y3l0cS9dhrio/jKEUhxkBVsj/mloUOffZUA=

View File

@ -1 +0,0 @@
sZOqnUMBAK57oEsGNoqXdIkxerNH1aGLv3IbvWssdAk=

View File

@ -1 +0,0 @@
sha256:dd0aa4847bd3e3b9d3970b1dd1e90ebd2e90e731873663167e3374c01b19fec1

View File

@ -1 +0,0 @@
{"C:\\Users\\73bul\\vsdbg\\vs2017u5":"/remote_debugger","C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Sdks\\Microsoft.Docker.Sdk\\tools\\TokenService.Proxy\\linux-x64\\net6.0":"/TokenService.Proxy","C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\MSBuild\\Sdks\\Microsoft.Docker.Sdk\\tools\\HotReloadProxy\\linux-x64\\net6.0":"/HotReloadProxy","C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\HotReload":"/HotReloadAgent","D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1":"/src/","C:\\Users\\73bul\\.nuget\\packages\\":"/.nuget/fallbackpackages"}

View File

@ -1 +0,0 @@
ID=.; if [ -e /etc/os-release ]; then . /etc/os-release; fi; if [ $ID = alpine ] && [ -e /remote_debugger/linux-musl-x64/vsdbg ]; then VSDBGPATH=/remote_debugger/linux-musl-x64; else VSDBGPATH=/remote_debugger; fi; $VSDBGPATH/vsdbg --interpreter=vscode

View File

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]

View File

@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Part1")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Part1")]
[assembly: System.Reflection.AssemblyTitleAttribute("Part1")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.

View File

@ -1 +0,0 @@
d43ff5423a16d15322b758e4b8a4a64d2ecac68213123491629720a8f32bfc9b

View File

@ -1,13 +0,0 @@
is_global = true
build_property.TargetFramework = net6.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Part1
build_property.ProjectDir = D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@ -1 +0,0 @@
85e76181036589b7b80e39219fc840736371361aec3e5d3ab435e7bccd4b3a70

View File

@ -1,14 +0,0 @@
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\bin\Debug\net6.0\Part1.exe
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\bin\Debug\net6.0\Part1.deps.json
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\bin\Debug\net6.0\Part1.runtimeconfig.json
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\bin\Debug\net6.0\Part1.dll
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\bin\Debug\net6.0\Part1.pdb
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.GeneratedMSBuildEditorConfig.editorconfig
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.AssemblyInfoInputs.cache
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.AssemblyInfo.cs
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.csproj.CoreCompileInputs.cache
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.dll
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\refint\Part1.dll
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.pdb
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\Part1.genruntimeconfig.cache
D:\Документы\GitHub\DAS_2023_1\almukhammetov_bulat_lab_2\Part1\obj\Debug\net6.0\ref\Part1.dll

View File

@ -1 +0,0 @@
e58803a5fe1e3b75ac9b204bdcc313077684139e3e7407db3e2e667ff77ba1c1

View File

@ -1,69 +0,0 @@
{
"format": 1,
"restore": {
"D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj": {}
},
"projects": {
"D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj",
"projectName": "Part1",
"projectPath": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj",
"packagesPath": "C:\\Users\\73bul\\.nuget\\packages\\",
"outputPath": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\73bul\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net6.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net6.0": {
"targetAlias": "net6.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net6.0": {
"targetAlias": "net6.0",
"dependencies": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets": {
"target": "Package",
"version": "[1.19.4, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\73bul\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.8.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\73bul\.nuget\packages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.visualstudio.azure.containers.tools.targets\1.19.4\build\Microsoft.VisualStudio.Azure.Containers.Tools.Targets.props" Condition="Exists('$(NuGetPackageRoot)microsoft.visualstudio.azure.containers.tools.targets\1.19.4\build\Microsoft.VisualStudio.Azure.Containers.Tools.Targets.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgMicrosoft_VisualStudio_Azure_Containers_Tools_Targets Condition=" '$(PkgMicrosoft_VisualStudio_Azure_Containers_Tools_Targets)' == '' ">C:\Users\73bul\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.19.4</PkgMicrosoft_VisualStudio_Azure_Containers_Tools_Targets>
</PropertyGroup>
</Project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.visualstudio.azure.containers.tools.targets\1.19.4\build\Microsoft.VisualStudio.Azure.Containers.Tools.Targets.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.visualstudio.azure.containers.tools.targets\1.19.4\build\Microsoft.VisualStudio.Azure.Containers.Tools.Targets.targets')" />
</ImportGroup>
</Project>

View File

@ -1,166 +0,0 @@
{
"version": 3,
"targets": {
"net6.0": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.19.4": {
"type": "package",
"build": {
"build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.props": {},
"build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.targets": {}
}
}
}
},
"libraries": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.19.4": {
"sha512": "aKxpRAUIxDrnSnyr7xJWGixOBgsB7Z4oHpWRkpRzzq04kfze4mN7944gRc4X9H2U5KG3A/btF74kavkO8KXqCg==",
"type": "package",
"path": "microsoft.visualstudio.azure.containers.tools.targets/1.19.4",
"hasTools": true,
"files": [
".nupkg.metadata",
".signature.p7s",
"CHANGELOG.md",
"EULA.md",
"ThirdPartyNotices.txt",
"build/Container.props",
"build/Container.targets",
"build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.props",
"build/Microsoft.VisualStudio.Azure.Containers.Tools.Targets.targets",
"build/Rules/GeneralBrowseObject.xaml",
"build/Rules/cs-CZ/GeneralBrowseObject.xaml",
"build/Rules/de-DE/GeneralBrowseObject.xaml",
"build/Rules/es-ES/GeneralBrowseObject.xaml",
"build/Rules/fr-FR/GeneralBrowseObject.xaml",
"build/Rules/it-IT/GeneralBrowseObject.xaml",
"build/Rules/ja-JP/GeneralBrowseObject.xaml",
"build/Rules/ko-KR/GeneralBrowseObject.xaml",
"build/Rules/pl-PL/GeneralBrowseObject.xaml",
"build/Rules/pt-BR/GeneralBrowseObject.xaml",
"build/Rules/ru-RU/GeneralBrowseObject.xaml",
"build/Rules/tr-TR/GeneralBrowseObject.xaml",
"build/Rules/zh-CN/GeneralBrowseObject.xaml",
"build/Rules/zh-TW/GeneralBrowseObject.xaml",
"build/ToolsTarget.props",
"build/ToolsTarget.targets",
"icon.png",
"microsoft.visualstudio.azure.containers.tools.targets.1.19.4.nupkg.sha512",
"microsoft.visualstudio.azure.containers.tools.targets.nuspec",
"tools/Microsoft.VisualStudio.Containers.Tools.Common.dll",
"tools/Microsoft.VisualStudio.Containers.Tools.Shared.dll",
"tools/Microsoft.VisualStudio.Containers.Tools.Tasks.dll",
"tools/Newtonsoft.Json.dll",
"tools/System.Security.Principal.Windows.dll",
"tools/cs/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/cs/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/cs/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/de/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/de/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/de/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/es/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/es/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/es/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/fr/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/fr/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/fr/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/it/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/it/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/it/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/ja/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/ja/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/ja/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/ko/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/ko/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/ko/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/pl/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/pl/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/pl/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/pt-BR/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/pt-BR/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/pt-BR/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/ru/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/ru/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/ru/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/tr/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/tr/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/tr/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/utils/KillProcess.exe",
"tools/zh-Hans/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/zh-Hans/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/zh-Hans/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll",
"tools/zh-Hant/Microsoft.VisualStudio.Containers.Tools.Common.resources.dll",
"tools/zh-Hant/Microsoft.VisualStudio.Containers.Tools.Shared.resources.dll",
"tools/zh-Hant/Microsoft.VisualStudio.Containers.Tools.Tasks.resources.dll"
]
}
},
"projectFileDependencyGroups": {
"net6.0": [
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets >= 1.19.4"
]
},
"packageFolders": {
"C:\\Users\\73bul\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj",
"projectName": "Part1",
"projectPath": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj",
"packagesPath": "C:\\Users\\73bul\\.nuget\\packages\\",
"outputPath": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\73bul\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net6.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net6.0": {
"targetAlias": "net6.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net6.0": {
"targetAlias": "net6.0",
"dependencies": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets": {
"target": "Package",
"version": "[1.19.4, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.100\\RuntimeIdentifierGraph.json"
}
}
}
}

View File

@ -1,10 +0,0 @@
{
"version": 2,
"dgSpecHash": "7dh4jTe7z/bzPj031BFBaN5wJQIUb8+xcjK/QcTHCHL00KdA9iUU9CGuqpy1J2k+tiVnyH85x0XwK2FaxOsqmg==",
"success": true,
"projectFilePath": "D:\\Документы\\GitHub\\DAS_2023_1\\almukhammetov_bulat_lab_2\\Part1\\Part1.csproj",
"expectedPackageFiles": [
"C:\\Users\\73bul\\.nuget\\packages\\microsoft.visualstudio.azure.containers.tools.targets\\1.19.4\\microsoft.visualstudio.azure.containers.tools.targets.1.19.4.nupkg.sha512"
],
"logs": []
}

View File

@ -1,20 +0,0 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Part2.csproj", "."]
RUN dotnet restore "./Part2.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "Part2.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Part2.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Part2.dll"]

View File

@ -1,16 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>.</DockerfileContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.4" />
</ItemGroup>
</Project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ActiveDebugProfile>Docker</ActiveDebugProfile>
</PropertyGroup>
</Project>

View File

@ -1,25 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.7.34018.315
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Part2", "Part2.csproj", "{9FC3CC84-848B-476A-9724-A216590556DC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9FC3CC84-848B-476A-9724-A216590556DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FC3CC84-848B-476A-9724-A216590556DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FC3CC84-848B-476A-9724-A216590556DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FC3CC84-848B-476A-9724-A216590556DC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {ED512BB2-49D3-4653-AADD-90FCCAD2C9BE}
EndGlobalSection
EndGlobal

View File

@ -1,43 +0,0 @@
var directoryPath = Environment.GetEnvironmentVariable("APP_DIR");
if (directoryPath == null)
{
Console.WriteLine("Не найден переменная среды адреса");
return;
}
var inputDataFilePath = Path.Combine(directoryPath, "result/inputFileFor2Program.txt");
var outputResultFilePath = Path.Combine(directoryPath, "result/result.txt");
Console.WriteLine($"Входной файл для второй программы: {inputDataFilePath}");
Console.WriteLine($"Выходной файл для второй программы {outputResultFilePath}");
if (File.Exists(inputDataFilePath))
{
// Чтение чисел из файла и поиск наибольшего числа
string[] lines = File.ReadAllLines(inputDataFilePath);
double largestNumber = double.MinValue; // Инициализируем наименьшим возможным значением
foreach (string line in lines)
{
if (double.TryParse(line, out double number))
{
if (number > largestNumber)
{
largestNumber = number;
}
}
}
double result = Math.Pow(largestNumber, 2);
// Сохраняем результат в файл
File.WriteAllText(outputResultFilePath, DateTime.Now.ToString() + "\nРезультат программы 2: " + result.ToString());
Console.WriteLine($"Наибольшее число в файле: {largestNumber}");
Console.WriteLine($"Квадрат наибольшего числа: {result}");
Console.WriteLine($"Результат сохранен в {outputResultFilePath}");
}
else
{
Console.WriteLine("Файл с данными не найден.");
}

View File

@ -1,10 +0,0 @@
{
"profiles": {
"Part2": {
"commandName": "Project"
},
"Docker": {
"commandName": "Docker"
}
}
}

View File

@ -1,34 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"Part2/1.0.0": {
"dependencies": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets": "1.19.4"
},
"runtime": {
"Part2.dll": {}
}
},
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.19.4": {}
}
},
"libraries": {
"Part2/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.19.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aKxpRAUIxDrnSnyr7xJWGixOBgsB7Z4oHpWRkpRzzq04kfze4mN7944gRc4X9H2U5KG3A/btF74kavkO8KXqCg==",
"path": "microsoft.visualstudio.azure.containers.tools.targets/1.19.4",
"hashPath": "microsoft.visualstudio.azure.containers.tools.targets.1.19.4.nupkg.sha512"
}
}
}

View File

@ -1,9 +0,0 @@
{
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
}
}
}

View File

@ -1 +0,0 @@
/app/bin/Debug/net6.0/Part2.dll

View File

@ -1 +0,0 @@
--additionalProbingPath /.nuget/fallbackpackages

View File

@ -1 +0,0 @@
1fe2d124ad6b2225a5f45fabeb3dd05dd90e633345ba8766d9cdca167467b2b5

Some files were not shown because too many files have changed in this diff Show More