Compare commits
193 Commits
alexandrov
...
main
Author | SHA1 | Date | |
---|---|---|---|
60ef5724cd | |||
6827a64c4d | |||
7de577eadc | |||
2690438508 | |||
e3677ed302 | |||
|
f5bc94c4ec | ||
f4ec46b14d | |||
ac085099f4 | |||
|
46f2a8da94 | ||
|
84bd5277a9 | ||
|
bb78e6823b | ||
|
ea990fd848 | ||
a284e473a9 | |||
c7ccb94de9 | |||
0a6ce933c7 | |||
d867909883 | |||
|
b9d3eb249b | ||
|
934dd837ac | ||
|
36c429cb4f | ||
|
61c94a9155 | ||
8496ba5b3e | |||
4e177372a9 | |||
a311037d8d | |||
6fea07c73d | |||
3f6234209a | |||
b3c9d6a471 | |||
080efc8a4c | |||
6e86bdcc1e | |||
51c5bfa80a | |||
a901a2b306 | |||
ffdf6c9ab9 | |||
a44eb5cb56 | |||
2270fa67e4 | |||
8ed344819f | |||
426dcca1ec | |||
e7ba5e4e23 | |||
5bca0d2e6f | |||
992635f9e5 | |||
ec6f254f98 | |||
e1be77f193 | |||
|
a8df36581d | ||
|
e3972e8932 | ||
|
e617f9ebbb | ||
5e2305d3ac | |||
89b987e416 | |||
2de04f60a9 | |||
a2cd0cf527 | |||
219ce2acfe | |||
cf88b559cc | |||
8f7c563a25 | |||
259bcd07f0 | |||
e68c51b313 | |||
12523aabaf | |||
b0d3c4cc7a | |||
7205c6f8f0 | |||
82cab3fc1b | |||
a0e60b3699 | |||
993786b8ae | |||
|
66525b2d4b | ||
|
7328dcb134 | ||
08e44c25c3 | |||
2c61f815fa | |||
2bdf735b95 | |||
2ef1f65ed6 | |||
7dcce0138f | |||
427173d554 | |||
5104f74803 | |||
5341271f9e | |||
e582711076 | |||
|
0a5d8d6e02 | ||
|
4498245823 | ||
|
b06fb8f5c5 | ||
|
1ffed2075a | ||
|
f7b9e00012 | ||
|
6afc3b032f | ||
|
a07d49560a | ||
|
1cd0264117 | ||
a346187851 | |||
97f2f1e018 | |||
314d96b716 | |||
d45d516d4a | |||
7c877e803d | |||
e07dde810d | |||
46ae5b2736 | |||
55d384cf1b | |||
3cc0bb20fc | |||
d36865cc2b | |||
34ecd9c33e | |||
9e7b0fcc03 | |||
a3d495ad1a | |||
0c34abeb21 | |||
86d0303d8d | |||
a5f9016bb5 | |||
38717b004c | |||
d613c85a20 | |||
db6e3e1ba6 | |||
4c7875241f | |||
6cf3fb6eda | |||
073265a64b | |||
176dd95462 | |||
5f1bb5e2bd | |||
5a1e7cb698 | |||
0a2777cf55 | |||
aeee4e3f7e | |||
927816dc42 | |||
660bc2681c | |||
f03ae3e342 | |||
59e524f061 | |||
dc26a1f48c | |||
a8f49f7572 | |||
|
722b354fab | ||
|
256e916485 | ||
|
9160de5e51 | ||
|
3593a55226 | ||
|
89f2a30f71 | ||
|
7d25138f9d | ||
44925143c2 | |||
c4c4873091 | |||
42b2bd7a78 | |||
1555cb5642 | |||
de4b5c8584 | |||
27bde41368 | |||
8926cf25c0 | |||
fb2cd5836b | |||
48b78907cb | |||
33c9790fef | |||
f6b74ebd83 | |||
60c5417187 | |||
ac825f136b | |||
fa99584756 | |||
da4a529412 | |||
3a1de5ead0 | |||
3ca3be38d3 | |||
c80433f4ca | |||
1d7145da66 | |||
985bf1ba01 | |||
880d359158 | |||
7ae3de0e65 | |||
4ccd7b91ff | |||
fda332b761 | |||
cd51734f82 | |||
be23ab0a6e | |||
cfb17604eb | |||
13d5139b19 | |||
c3c07e870e | |||
0cf1b56fd2 | |||
f17187207a | |||
b7187c8f60 | |||
81f8116770 | |||
06de5e8246 | |||
c99644f2d4 | |||
d0d2bcf2db | |||
301f7ad941 | |||
711b7d275a | |||
|
60be16bdbc | ||
|
46001bf28b | ||
|
fadbd75718 | ||
38854734b5 | |||
|
3f98128517 | ||
|
9b69bb7feb | ||
|
7459415f70 | ||
|
6ddd513f75 | ||
ad6a4552db | |||
|
7bdeec66ba | ||
e35c9da7e0 | |||
c83f26573c | |||
01a4946295 | |||
ad12c8f3ac | |||
45b0dc6f0a | |||
71bc735b26 | |||
a1f814a584 | |||
5044e52972 | |||
d39df3e247 | |||
df28992456 | |||
f67d0375f9 | |||
977bdd56b2 | |||
063e631fc0 | |||
|
775bd41749 | ||
|
b75a601ab9 | ||
9022f7ad44 | |||
0eb56e61da | |||
04fc1cf183 | |||
170d671dff | |||
eaa28196ec | |||
b0c2b37252 | |||
aac23548d7 | |||
43ba1a2bb8 | |||
bc9fbb58dc | |||
1ca5dad17e | |||
79c62bdf6a | |||
49a6a252e3 | |||
|
5120eec932 | ||
076820725d |
27
alexandrov_dmitrii_lab_3/docker-compose.yml
Normal file
27
alexandrov_dmitrii_lab_3/docker-compose.yml
Normal file
@ -0,0 +1,27 @@
|
||||
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
|
11
alexandrov_dmitrii_lab_3/message_service/Dockerfile
Normal file
11
alexandrov_dmitrii_lab_3/message_service/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
||||
FROM python:3.9
|
||||
|
||||
EXPOSE 8081
|
||||
|
||||
RUN pip install Flask requests
|
||||
|
||||
WORKDIR /work
|
||||
|
||||
COPY msg_service.py ./
|
||||
|
||||
CMD ["python", "msg_service.py"]
|
50
alexandrov_dmitrii_lab_3/message_service/msg_service.py
Normal file
50
alexandrov_dmitrii_lab_3/message_service/msg_service.py
Normal file
@ -0,0 +1,50 @@
|
||||
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)
|
27
alexandrov_dmitrii_lab_3/nginx.conf
Normal file
27
alexandrov_dmitrii_lab_3/nginx.conf
Normal file
@ -0,0 +1,27 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
32
alexandrov_dmitrii_lab_3/readme.md
Normal file
32
alexandrov_dmitrii_lab_3/readme.md
Normal file
@ -0,0 +1,32 @@
|
||||
## Задание
|
||||
|
||||
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
|
11
alexandrov_dmitrii_lab_3/user_service/Dockerfile
Normal file
11
alexandrov_dmitrii_lab_3/user_service/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
||||
FROM python:3.9
|
||||
|
||||
EXPOSE 8082
|
||||
|
||||
RUN pip install Flask requests
|
||||
|
||||
WORKDIR /work
|
||||
|
||||
COPY usr_service.py ./
|
||||
|
||||
CMD ["python", "usr_service.py"]
|
56
alexandrov_dmitrii_lab_3/user_service/usr_service.py
Normal file
56
alexandrov_dmitrii_lab_3/user_service/usr_service.py
Normal file
@ -0,0 +1,56 @@
|
||||
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)
|
109
alexandrov_dmitrii_lab_5/matrix.py
Normal file
109
alexandrov_dmitrii_lab_5/matrix.py
Normal file
@ -0,0 +1,109 @@
|
||||
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 + " "
|
||||
for b in range(size):
|
||||
res = res + str(m_b[i][b]) + ", "
|
||||
res = res + " "
|
||||
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
|
37
alexandrov_dmitrii_lab_5/readme.md
Normal file
37
alexandrov_dmitrii_lab_5/readme.md
Normal file
@ -0,0 +1,37 @@
|
||||
## Задание
|
||||
Создать программу, производящую параллельные умножения реализовать двух больших квадратных матриц.
|
||||
|
||||
## Выполнение
|
||||
Программа состоит из модуля-сервиса 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
|
BIN
alexandrov_dmitrii_lab_5/screens/bench.png
Normal file
BIN
alexandrov_dmitrii_lab_5/screens/bench.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
BIN
alexandrov_dmitrii_lab_5/screens/get15.png
Normal file
BIN
alexandrov_dmitrii_lab_5/screens/get15.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 84 KiB |
BIN
alexandrov_dmitrii_lab_5/screens/get5.png
Normal file
BIN
alexandrov_dmitrii_lab_5/screens/get5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
35
alexandrov_dmitrii_lab_5/service.py
Normal file
35
alexandrov_dmitrii_lab_5/service.py
Normal file
@ -0,0 +1,35 @@
|
||||
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)
|
18
alexandrov_dmitrii_lab_5/template.html
Normal file
18
alexandrov_dmitrii_lab_5/template.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!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>
|
109
alexandrov_dmitrii_lab_6/matrix.py
Normal file
109
alexandrov_dmitrii_lab_6/matrix.py
Normal file
@ -0,0 +1,109 @@
|
||||
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
|
42
alexandrov_dmitrii_lab_6/readme.md
Normal file
42
alexandrov_dmitrii_lab_6/readme.md
Normal file
@ -0,0 +1,42 @@
|
||||
## Задание
|
||||
Создать программу, производящую поиск детерминанта больших квадратных матриц.
|
||||
|
||||
## Выполнение
|
||||
Программа состоит из модуля-сервиса 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
|
BIN
alexandrov_dmitrii_lab_6/screens/30x30.png
Normal file
BIN
alexandrov_dmitrii_lab_6/screens/30x30.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 64 KiB |
BIN
alexandrov_dmitrii_lab_6/screens/5x5.png
Normal file
BIN
alexandrov_dmitrii_lab_6/screens/5x5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
BIN
alexandrov_dmitrii_lab_6/screens/bench.png
Normal file
BIN
alexandrov_dmitrii_lab_6/screens/bench.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 41 KiB |
35
alexandrov_dmitrii_lab_6/service.py
Normal file
35
alexandrov_dmitrii_lab_6/service.py
Normal file
@ -0,0 +1,35 @@
|
||||
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)
|
18
alexandrov_dmitrii_lab_6/template.html
Normal file
18
alexandrov_dmitrii_lab_6/template.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!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>
|
20
alexandrov_dmitrii_lab_7/readme.md
Normal file
20
alexandrov_dmitrii_lab_7/readme.md
Normal file
@ -0,0 +1,20 @@
|
||||
## Задание
|
||||
|
||||
Балансировка нагрузки в распределённых системах при помощи открытых технологий на примерах.
|
||||
Написать небольшое эссе (буквально несколько абзацев) своими словами (пожалуйста не пользуйтесь гуглом :). А помогут Вам в этом вопросы из списка:
|
||||
|
||||
1. Какие алгоритмы и методы используются для балансировки нагрузки?
|
||||
2. Какие открытые технологии существуют для балансировки нагрузки?
|
||||
3. Как осуществляется балансировка нагрузки на базах данных?
|
||||
4. Реверс-прокси как один из элементов балансировки нагрузки.
|
||||
|
||||
## Результат
|
||||
|
||||
Балансировка нагрузки - это управление распределением траффика между несколькими сервисами, системными компонентами. Необходимо для повышения надёжности и производительности системы.
|
||||
Для балансировки нагрузки используются следующие методы: последовательная циклическая передача запросов по списку обработчиков, передача запросов в наименее загруженный обработчик, либо также, но с учётом его вместимости, передача запросов в обработчик с наименьшим временем отклика, передача запросов от одного источника одному серверу с обработчиками.
|
||||
|
||||
Для балансировки могут использоваться программы: прокси-сервера, например Nginx, в современных системах развёртки они могут быть "встроены" (Azure). Балансировка может быть реализована также на аппаратном уровне сетевых устройств, предоставляться облачными сервисами.
|
||||
|
||||
Для БД также есть прокси (PL/Proxy), на уровне серверов СУБД могут распределяться таблицы (по серверам) одной БД, либо даже расщепляться и распределяться отдельные таблицы. Вообще многое управление может быть решено на уровне выше СУБД - в приложениях, существуют специализированные приложения для синхронной и асинхронной работы с БД, в том числе такие, которые осуществляют распределение запросов.
|
||||
|
||||
Обратное прокси - это прокси, который работает вовнутрь системы. То есть, он ретранслирует запросы из внешней сети на подключённые сервера внутренней. Как элемент распределения нагрузки он важен, так как является тем узлом системы, через который будут проходить запросы, которые необходимо распределять. Соответственно многие решения реализуются на уровне прокси-серверов.
|
32
alexandrov_dmitrii_lab_8/readme.md
Normal file
32
alexandrov_dmitrii_lab_8/readme.md
Normal file
@ -0,0 +1,32 @@
|
||||
## Задание
|
||||
|
||||
Написать небольшое эссе (буквально несколько абзацев) своими словами (пожалуйста не пользуйтесь гуглом :) ) на тему "Устройство распределенных систем". А помогут Вам в этом вопросы из списка:
|
||||
|
||||
* Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
|
||||
* Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
|
||||
* Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
|
||||
* Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
|
||||
* Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.
|
||||
|
||||
## Эссе
|
||||
|
||||
Распределённые системы - это ещё одно проявление тенденции к дроблению процессов и структур. Такое уже проявилось в проектировании, конструировании и т.д.
|
||||
Здесь оно проявляется в программных системах. Вызвано это, во-первых, качественным ростом навыков и инструментов разработки, что открыло технический и гносеологический доступ к более сложным системам и технологиям для их освоения, во-вторых, ростом размера систем и запросов к ним, соответственно появление нужды в сложных больших системах.
|
||||
|
||||
Распределённые системы - это системы, состоящие из множества размещённых независимо программ, вместе исполняющих общую функциональность.
|
||||
Для сложных, особенно сетевых, систем это означает удобные развёртывание и масштабирование: можно развернуть множество узлов, распределить по ним функционал, при необходимости легко заменить, переместить или дублировать какую-то часть функционала.
|
||||
Также это означает большую надёжность: если сломается какой-то узкоспециализированный сервис, остальной функционал продолжит работу.
|
||||
|
||||
Для большего дробления и лучшей организации были созданы системы оркестрации приложений - системы, которые создают множество контейнеров или иных отделённых специализированных микросред для сервисов и программ для оптимизации их работы и централизованного ими управления.
|
||||
С другой стороны, они позволяют интегрировать системы через сеть, объединяя такие среды с разных машин в единую среду для работы одной программной системы.
|
||||
Они как упрощают разработку, позволяя организовать её через сеть, тестировать распределённые по микросредам систему, упрощают сопровождение, так как предоставляют удобное управление своими узлами и средами.
|
||||
В то же время они создают ещё один слой разработки и проектирования, требуют дополнительных ресурсов.
|
||||
|
||||
Очереди обработки сообщений нужны для организации асинхронного взаимодействия частей распределённых приложений, они выделить в отдельный слой всю информацию о связях сервисов. Сообщения могут быть чем угодно - командами, данными, любой нужной сервисам от других сервисов информацией.
|
||||
Выделение этого слоя позволяет снизить связность сервисов, что является одной из причин распределения.
|
||||
|
||||
Примущества распределённых систем в удобстве развёртки и распределения разработки. Недостатки в требовательности к координации, сильном усложнении используемых инструментов и технологий.
|
||||
|
||||
В сложную распределённую систему может быть как целесообразно, так и нецелесообразно внедрять параллельные вычисления. Для распределённых систем оно будет более целесообразным, так как распределённость сама по себе подразумевает некоторую параллельность.
|
||||
В общем случае, технологии внедряются по необходимости: когда достигнут предел (скорее всего временной) возможностей последовательной обработки отдельной машиной. Для распределённых же систем распараллеливание будет более естественным процессом, благодаря средствам развёртки, таким как системы оркестрации, становится удобным создавать большие вычислительные сети.
|
||||
Тем не менее, в таком случае может оказаться, что вычислительные мощности излишни для задач, которые не может решить отдельная машина. Параллельная обработка нужна только для незаурядных по объёмам или временным рамкам задач: например для научных вычислений, для оперирования большими объёмами информации, обучения больших машинных сетей. Это задачи, с которыми одна машина не может адекватно справиться.
|
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part1/.vs/Part1/v17/.futdcache.v2
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/.vs/Part1/v17/.futdcache.v2
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part1/.vs/Part1/v17/.suo
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/.vs/Part1/v17/.suo
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
32
almukhammetov_bulat_lab_2/Part1/Dockerfile
Normal file
32
almukhammetov_bulat_lab_2/Part1/Dockerfile
Normal file
@ -0,0 +1,32 @@
|
||||
# Используем образ .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"]
|
16
almukhammetov_bulat_lab_2/Part1/Part1.csproj
Normal file
16
almukhammetov_bulat_lab_2/Part1/Part1.csproj
Normal file
@ -0,0 +1,16 @@
|
||||
<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>
|
9
almukhammetov_bulat_lab_2/Part1/Part1.csproj.user
Normal file
9
almukhammetov_bulat_lab_2/Part1/Part1.csproj.user
Normal file
@ -0,0 +1,9 @@
|
||||
<?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>
|
25
almukhammetov_bulat_lab_2/Part1/Part1.sln
Normal file
25
almukhammetov_bulat_lab_2/Part1/Part1.sln
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
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
|
55
almukhammetov_bulat_lab_2/Part1/Program.cs
Normal file
55
almukhammetov_bulat_lab_2/Part1/Program.cs
Normal file
@ -0,0 +1,55 @@
|
||||
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());
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Part1": {
|
||||
"commandName": "Project"
|
||||
},
|
||||
"Docker": {
|
||||
"commandName": "Docker"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
BIN
almukhammetov_bulat_lab_2/Part1/bin/Debug/net6.0/Part1.dll
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/bin/Debug/net6.0/Part1.dll
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part1/bin/Debug/net6.0/Part1.exe
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/bin/Debug/net6.0/Part1.exe
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part1/bin/Debug/net6.0/Part1.pdb
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/bin/Debug/net6.0/Part1.pdb
Normal file
Binary file not shown.
@ -0,0 +1,9 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net6.0",
|
||||
"framework": {
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "6.0.0"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
/app/bin/Debug/net6.0/Part1.dll
|
@ -0,0 +1 @@
|
||||
--additionalProbingPath /.nuget/fallbackpackages
|
@ -0,0 +1 @@
|
||||
NoConflict
|
@ -0,0 +1 @@
|
||||
Fast
|
@ -0,0 +1 @@
|
||||
0e4a486e8d81d00f192d2816ae8892d1536fbf86ae98681bec683af12578939b
|
@ -0,0 +1 @@
|
||||
Part1
|
@ -0,0 +1 @@
|
||||
Unknown
|
@ -0,0 +1 @@
|
||||
TTrD3JA/y3l0cS9dhrio/jKEUhxkBVsj/mloUOffZUA=
|
@ -0,0 +1 @@
|
||||
sZOqnUMBAK57oEsGNoqXdIkxerNH1aGLv3IbvWssdAk=
|
@ -0,0 +1 @@
|
||||
sha256:dd0aa4847bd3e3b9d3970b1dd1e90ebd2e90e731873663167e3374c01b19fec1
|
@ -0,0 +1 @@
|
||||
Linux
|
@ -0,0 +1 @@
|
||||
DotNetCore
|
@ -0,0 +1 @@
|
||||
{"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"}
|
@ -0,0 +1 @@
|
||||
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
|
@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
|
@ -0,0 +1,23 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <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.
|
||||
|
@ -0,0 +1 @@
|
||||
d43ff5423a16d15322b758e4b8a4a64d2ecac68213123491629720a8f32bfc9b
|
@ -0,0 +1,13 @@
|
||||
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 =
|
@ -0,0 +1,8 @@
|
||||
// <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;
|
Binary file not shown.
@ -0,0 +1 @@
|
||||
85e76181036589b7b80e39219fc840736371361aec3e5d3ab435e7bccd4b3a70
|
@ -0,0 +1,14 @@
|
||||
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
|
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/Part1.dll
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/Part1.dll
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
||||
e58803a5fe1e3b75ac9b204bdcc313077684139e3e7407db3e2e667ff77ba1c1
|
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/Part1.pdb
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/Part1.pdb
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/apphost.exe
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/apphost.exe
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/ref/Part1.dll
Normal file
BIN
almukhammetov_bulat_lab_2/Part1/obj/Debug/net6.0/ref/Part1.dll
Normal file
Binary file not shown.
Binary file not shown.
@ -0,0 +1,69 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?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>
|
@ -0,0 +1,6 @@
|
||||
<?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>
|
166
almukhammetov_bulat_lab_2/Part1/obj/project.assets.json
Normal file
166
almukhammetov_bulat_lab_2/Part1/obj/project.assets.json
Normal file
@ -0,0 +1,166 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
10
almukhammetov_bulat_lab_2/Part1/obj/project.nuget.cache
Normal file
10
almukhammetov_bulat_lab_2/Part1/obj/project.nuget.cache
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"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": []
|
||||
}
|
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part2/.vs/Part2/v17/.futdcache.v2
Normal file
BIN
almukhammetov_bulat_lab_2/Part2/.vs/Part2/v17/.futdcache.v2
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part2/.vs/Part2/v17/.suo
Normal file
BIN
almukhammetov_bulat_lab_2/Part2/.vs/Part2/v17/.suo
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
20
almukhammetov_bulat_lab_2/Part2/Dockerfile
Normal file
20
almukhammetov_bulat_lab_2/Part2/Dockerfile
Normal file
@ -0,0 +1,20 @@
|
||||
#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"]
|
16
almukhammetov_bulat_lab_2/Part2/Part2.csproj
Normal file
16
almukhammetov_bulat_lab_2/Part2/Part2.csproj
Normal file
@ -0,0 +1,16 @@
|
||||
<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>
|
6
almukhammetov_bulat_lab_2/Part2/Part2.csproj.user
Normal file
6
almukhammetov_bulat_lab_2/Part2/Part2.csproj.user
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ActiveDebugProfile>Docker</ActiveDebugProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
25
almukhammetov_bulat_lab_2/Part2/Part2.sln
Normal file
25
almukhammetov_bulat_lab_2/Part2/Part2.sln
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
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
|
43
almukhammetov_bulat_lab_2/Part2/Program.cs
Normal file
43
almukhammetov_bulat_lab_2/Part2/Program.cs
Normal file
@ -0,0 +1,43 @@
|
||||
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("Файл с данными не найден.");
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
{
|
||||
"profiles": {
|
||||
"Part2": {
|
||||
"commandName": "Project"
|
||||
},
|
||||
"Docker": {
|
||||
"commandName": "Docker"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
BIN
almukhammetov_bulat_lab_2/Part2/bin/Debug/net6.0/Part2.dll
Normal file
BIN
almukhammetov_bulat_lab_2/Part2/bin/Debug/net6.0/Part2.dll
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part2/bin/Debug/net6.0/Part2.exe
Normal file
BIN
almukhammetov_bulat_lab_2/Part2/bin/Debug/net6.0/Part2.exe
Normal file
Binary file not shown.
BIN
almukhammetov_bulat_lab_2/Part2/bin/Debug/net6.0/Part2.pdb
Normal file
BIN
almukhammetov_bulat_lab_2/Part2/bin/Debug/net6.0/Part2.pdb
Normal file
Binary file not shown.
@ -0,0 +1,9 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net6.0",
|
||||
"framework": {
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "6.0.0"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
/app/bin/Debug/net6.0/Part2.dll
|
@ -0,0 +1 @@
|
||||
--additionalProbingPath /.nuget/fallbackpackages
|
@ -0,0 +1 @@
|
||||
Skipped
|
@ -0,0 +1 @@
|
||||
Fast
|
@ -0,0 +1 @@
|
||||
1fe2d124ad6b2225a5f45fabeb3dd05dd90e633345ba8766d9cdca167467b2b5
|
@ -0,0 +1 @@
|
||||
Part2
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user