Compare commits

..

359 Commits

Author SHA1 Message Date
Никита Чернышов
5dd9e26f07 chernyshov_nikita_lab_3 is ready 2024-12-15 16:26:38 +04:00
60e2c7996c Merge pull request 'nikolaeva_yana_lab_3' (#337) from nikolaeva_yana_lab_3 into main
Reviewed-on: #337
2024-12-15 14:54:45 +04:00
95d2554f95 Merge pull request 'kurushina_ksenia_lab_3' (#331) from kurushina_ksenia_lab_3 into main
Reviewed-on: #331
2024-12-15 14:52:52 +04:00
d9c57f2e8e Merge pull request 'fadeeva_nastya_laab_8' (#330) from fadeeva_nastya_lab_8 into main
Reviewed-on: #330
2024-12-15 14:52:33 +04:00
158c0670a4 Merge pull request 'ismailov_rovshan_lab_8 is ready' (#329) from ismailov_rovshan_lab_8 into main
Reviewed-on: #329
2024-12-15 14:49:58 +04:00
df8cf26c03 Merge pull request 'ismailov_rovshan_lab_7 is ready' (#328) from ismailov_rovshan_lab_7 into main
Reviewed-on: #328
2024-12-15 14:49:13 +04:00
9495f5cd12 Merge pull request 'ismailov_rovshan_lab_6 is ready' (#327) from ismailov_rovshan_lab_6 into main
Reviewed-on: #327
2024-12-15 14:48:54 +04:00
9e71d368c8 Merge pull request 'ismailov_rovshan_lab_5 is ready' (#326) from ismailov_rovshan_lab_5 into main
Reviewed-on: #326
2024-12-15 14:48:34 +04:00
5c8dbc4ae3 Merge pull request 'ismailov_rovshan_lab_4 is ready' (#325) from ismailov_rovshan_lab_4 into main
Reviewed-on: #325
2024-12-15 14:48:19 +04:00
e89eb8fc8d Merge pull request 'melnikov_igor_lab_5' (#321) from melnikov_igor_lab_5 into main
Reviewed-on: #321
2024-12-15 14:46:53 +04:00
a74ea43db8 Merge pull request 'fadeeva_nastya_lab_7' (#316) from fadeeva_nastya_lab_7 into main
Reviewed-on: #316
2024-12-15 14:44:23 +04:00
f1afb24c8b Merge pull request 'fadeeva_nastya_lab_6' (#315) from fadeeva_nastya_lab_6 into main
Reviewed-on: #315
2024-12-15 14:43:59 +04:00
2c12d97510 Merge pull request 'fadeeva_nastya_lab_5' (#314) from fadeeva_nastya_lab_5 into main
Reviewed-on: #314
2024-12-15 14:43:43 +04:00
00c170a00c Merge pull request 'fadeeva_nastya_lab_4' (#313) from fadeeva_nastya_lab_4 into main
Reviewed-on: #313
2024-12-15 14:43:22 +04:00
c620f10752 Merge pull request 'ismailov_rovshan_lab_3' (#312) from ismailov_rovshan_lab_3 into main
Reviewed-on: #312
2024-12-15 14:41:48 +04:00
e46d33bc4d Merge pull request 'bondarenko_max_lab_8' (#311) from bondarenko_max_lab_8 into main
Reviewed-on: #311
2024-12-15 14:40:29 +04:00
1a11fca0e4 Merge pull request 'bondarenko_max_lab_7' (#310) from bondarenko_max_lab_7 into main
Reviewed-on: #310
2024-12-15 14:39:55 +04:00
db9395340c Merge pull request 'fadeeva_nastya_lab_3 is ready' (#309) from fadeeva_nastya_lab_3 into main
Reviewed-on: #309
2024-12-15 14:39:41 +04:00
9485011484 Merge pull request 'bondarenko_max_lab_6' (#308) from bondarenko_max_lab_6 into main
Reviewed-on: #308
2024-12-15 14:39:12 +04:00
75c4fde178 Merge pull request 'bondarenko_max_lab_5' (#307) from bondarenko_max_lab_5 into main
Reviewed-on: #307
2024-12-15 14:37:58 +04:00
93f689f155 Merge pull request 'vasina_ekaterina_lab_8' (#301) from vasina_ekaterina_lab_8 into main
Reviewed-on: #301
2024-12-15 14:35:41 +04:00
6e224cf288 Merge pull request 'vasina_ekaterina_lab_7' (#300) from vasina_ekaterina_lab_7 into main
Reviewed-on: #300
2024-12-15 14:35:19 +04:00
a9fba22e19 Merge pull request 'vasina_ekaterina_lab_6' (#299) from vasina_ekaterina_lab_6 into main
Reviewed-on: #299
2024-12-15 14:35:05 +04:00
d7008ca1e5 Merge pull request 'vasina_ekaterina_lab_4' (#297) from vasina_ekaterina_lab_4 into main
Reviewed-on: #297
2024-12-15 14:33:15 +04:00
3fb94595bc Merge pull request 'bondarenko_max_lab_4' (#295) from bondarenko_max_lab_4 into main
Reviewed-on: #295
2024-12-15 14:23:54 +04:00
14de0603a8 Merge pull request 'vasina_ekaterina_lab_3' (#294) from vasina_ekaterina_lab_3 into main
Reviewed-on: #294
2024-12-15 14:23:19 +04:00
31346e7082 Merge pull request 'fadeeva_nastya_lab_2 is ready' (#293) from fadeeva_nastya_lab_2 into main
Reviewed-on: #293
2024-12-15 14:23:01 +04:00
fc6f211197 Merge pull request 'alkin_ivan_lab_3' (#292) from alkin_ivan_lab_3 into main
Reviewed-on: #292
2024-12-15 14:22:40 +04:00
b5944df141 Merge pull request 'chernyshov_nikita_lab_2' (#289) from chernyshov_nikita_lab_2 into main 2024-12-15 14:13:35 +04:00
Никита Чернышов
1812ac159e Chernyshov Nikita Lab2 is Ready 2024-12-15 14:13:35 +04:00
fa4c181ac0 Merge pull request 'Chernyshov Nikita Lab1 is Ready' (#270) from chernyshov_nikita_lab_1 into main
Reviewed-on: #270
2024-12-15 14:12:49 +04:00
4343669b5a Merge pull request 'alkin_ivan_lab_2' (#271) from alkin_ivan_lab_2 into main
Reviewed-on: #271
2024-12-15 14:12:18 +04:00
d95e2a9d3a Merge pull request 'nikolaeva_yana_lab_2' (#272) from nikolaeva_yana_lab_2 into main
Reviewed-on: #272
2024-12-15 14:12:00 +04:00
2f9c00b03b Merge pull request 'novopolcev_alexander_lab_3' (#281) from novopolcev_alexander_lab_3 into main
Reviewed-on: #281
2024-12-15 14:06:49 +04:00
51af80f3ad Merge pull request 'novopolcev_alexander_lab_2' (#249) from novopolcev_alexander_lab_2 into main
Reviewed-on: #249
2024-12-15 14:01:47 +04:00
1fffeaa7e9 Merge pull request 'putilin_pavel_lab_4' (#252) from putilin_pavel_lab_4 into main
Reviewed-on: #252
2024-12-15 13:55:43 +04:00
a463ec8241 Merge pull request 'afanasev_dmitry_lab_8 is ready' (#244) from afanasev_dmitry_lab_8 into main
Reviewed-on: #244
2024-12-15 13:55:04 +04:00
7a1ba7aa9a Merge pull request 'polevoy_sergey_lab_8' (#246) from polevoy_sergey_lab_8 into main
Reviewed-on: #246
2024-12-15 13:54:40 +04:00
08cc99b0fc Merge pull request 'nikolaeva_yana_lab_1 is ready' (#254) from nikolaeva_yana_lab_1 into main
Reviewed-on: #254
2024-12-15 13:53:35 +04:00
6556e21d9a Merge pull request 'kurushina_ksenia_lab_1' (#256) from kurushina_ksenia_lab_1 into main
Reviewed-on: #256
2024-12-15 13:52:48 +04:00
7accd18aea Merge pull request 'fadeeva_nastya_lab_1' (#263) from fadeeva_nastya_lab_1 into main
Reviewed-on: #263
2024-12-15 13:41:31 +04:00
bfc6d8bb95 Merge pull request 'kurushina_ksenia_lab_2' (#261) from kurushina_ksenia_lab_2 into main
Reviewed-on: #261
2024-12-15 13:40:51 +04:00
cdd0a7b7c9 Merge pull request 'bondarenko_max_lab_2' (#231) from bondarenko_max_lab_2 into main
Reviewed-on: #231
2024-12-15 13:38:02 +04:00
27850eb504 Merge pull request 'haliullov_kamil_lab_1' (#232) from haliullov_kamil_lab_1 into main
Reviewed-on: #232
2024-12-15 13:37:40 +04:00
6feebae507 Merge pull request 'karamushko_maxim_lab1' (#234) from karamushko_maxim_lab_1 into main
Reviewed-on: #234
2024-12-15 13:36:09 +04:00
1648f5995a Merge pull request 'kalyshev_yan_lab_6' (#235) from kalyshev_yan_lab_6 into main
Reviewed-on: #235
2024-12-15 13:35:48 +04:00
bf8d06a85d Merge pull request 'bazunov andrew lab 8 ready' (#239) from bazunov_andrew_lab_8 into main
Reviewed-on: #239
2024-12-15 13:35:08 +04:00
de0f1780c7 Merge pull request 'afanasev_dmitry_lab_6 is ready' (#242) from afanasev_dmitry_lab_6 into main
Reviewed-on: #242
2024-12-15 13:33:07 +04:00
e54fd14090 Merge pull request 'minhasapov_ruslan_lab_6' (#211) from minhasapov_ruslan_lab_6 into main
Reviewed-on: #211
2024-12-15 13:32:11 +04:00
ce580c4572 Merge pull request 'minhasapov_ruslan_lab_5' (#210) from minhasapov_ruslan_lab_5 into main
Reviewed-on: #210
2024-12-15 13:31:35 +04:00
84f32a0993 Merge pull request 'ismailov_rovshan_lab_2 is ready' (#222) from ismailov_rovshan_lab_2 into main
Reviewed-on: #222
2024-12-15 13:30:41 +04:00
7a36b2b0af Merge pull request 'presnyakova_victoria_lab_6' (#219) from presnyakova_victoria_lab_6 into main
Reviewed-on: #219
2024-12-15 13:30:18 +04:00
02d6165c7e Merge pull request 'polevoy_sergey_lab_6' (#218) from polevoy_sergey_lab_6 into main
Reviewed-on: #218
2024-12-15 13:30:03 +04:00
18c838d58c Merge pull request 'polevoy_sergey_lab_5' (#215) from polevoy_sergey_lab_5 into main
Reviewed-on: #215
2024-12-15 13:29:40 +04:00
9d6529c11d Merge pull request 'rogashova_ekaterina_lab_6' (#214) from rogashova_ekaterina_lab_6 into main
Reviewed-on: #214
2024-12-15 13:29:18 +04:00
1dc61d09d4 Merge pull request 'artamonova_tatyana_lab_6 is ready' (#205) from artamonova_tatyana_lab_6 into main
Reviewed-on: #205
2024-12-15 13:27:00 +04:00
84edc080bd Merge pull request 'artamonova_tatyana_lab_7 is ready' (#206) from artamonova_tatyana_lab_7 into main
Reviewed-on: #206
2024-12-15 13:26:41 +04:00
885ad1ffec Merge pull request 'artamonova_tatyana_lab_8 is ready' (#207) from artamonova_tatyana_lab_8 into main
Reviewed-on: #207
2024-12-15 13:26:25 +04:00
4b1c9666a0 Merge pull request 'polevoy_sergey_lab_4' (#208) from polevoy_sergey_lab_4 into main
Reviewed-on: #208
2024-12-15 13:23:01 +04:00
135f79e158 Merge pull request 'minhasapov_ruslan_lab_4' (#209) from minhasapov_ruslan_lab_4 into main
Reviewed-on: #209
2024-12-15 13:22:35 +04:00
62b20a244e Merge pull request 'minhasapov_ruslan_lab_8' (#213) from minhasapov_ruslan_lab_8 into main
Reviewed-on: #213
2024-12-15 13:21:15 +04:00
e8f3643fd1 Merge pull request 'minhasapov_ruslan_lab_7' (#212) from minhasapov_ruslan_lab_7 into main
Reviewed-on: #212
2024-12-15 13:20:57 +04:00
2a388e9788 Merge pull request 'rogashova_ekaterina_lab_7' (#216) from rogashova_ekaterina_lab_7 into main
Reviewed-on: #216
2024-12-15 13:20:37 +04:00
3be8ceb996 Merge pull request 'rogashova_ekaterina_lab_8' (#217) from rogashova_ekaterina_lab_8 into main
Reviewed-on: #217
2024-12-15 13:20:08 +04:00
84786b8531 Merge pull request 'presnyakova_victoria_lab_7' (#220) from presnyakova_victoria_lab_7 into main
Reviewed-on: #220
2024-12-15 13:18:44 +04:00
6b370579f8 Merge pull request 'presnyakova_victoria_lab_8' (#221) from presnyakova_victoria_lab_8 into main
Reviewed-on: #221
2024-12-15 13:18:29 +04:00
a608e3a24b Merge pull request 'aleikin_artem_lab4' (#225) from aleikin_artem_lab4 into main
Reviewed-on: #225
2024-12-15 13:17:00 +04:00
4f7d9d4ba1 Merge pull request 'bondarenko_max_lab_3' (#233) from bondarenko_max_lab_3 into main
Reviewed-on: #233
2024-12-15 13:12:06 +04:00
547212dca6 Merge pull request 'bazunov andrew lab 7 ready' (#238) from bazunov_andrew_lab_7 into main
Reviewed-on: #238
2024-12-15 13:10:45 +04:00
58f4127148 Merge pull request 'putilin_pavel_lab_3' (#241) from putilin_pavel_lab_3 into main
Reviewed-on: #241
2024-12-15 13:10:28 +04:00
f12a88ed52 Merge pull request 'afanasev_dmitry_lab_7 is ready' (#243) from afanasev_dmitry_lab_7 into main
Reviewed-on: #243
2024-12-15 13:09:46 +04:00
e3979acf4d Merge pull request 'polevoy_sergey_lab_7' (#245) from polevoy_sergey_lab_7 into main
Reviewed-on: #245
2024-12-15 13:08:23 +04:00
8640f9e8fc Merge pull request 'kosheev_maksim_lab_4' (#247) from kosheev_maksim_lab_4 into main
Reviewed-on: #247
2024-12-15 13:08:03 +04:00
c26a7b8d97 Merge pull request 'kosheev_maksim_lab_7' (#250) from kosheev_maksim_lab_7 into main
Reviewed-on: #250
2024-12-15 13:04:27 +04:00
29320bae24 Merge pull request 'novopolcev_alexander_lab_1' (#248) from novopolcev_alexander_lab_1 into main
Reviewed-on: #248
2024-12-15 13:03:47 +04:00
5449675d39 Merge pull request 'artamonova_tatyana_lab_5 is ready' (#204) from artamonova_tatyana_lab_5 into main
Reviewed-on: #204
2024-12-15 12:53:40 +04:00
b895c806e7 Merge pull request 'rogashova_ekaterina_lab_5' (#203) from rogashova_ekaterina_lab_5 into main
Reviewed-on: #203
2024-12-15 12:52:53 +04:00
920dec1ede Merge pull request 'polevoy_sergey_lab_3' (#202) from polevoy_sergey_lab_3 into main
Reviewed-on: #202
2024-12-15 12:52:33 +04:00
fdba824237 Merge pull request 'minhasapov_ruslan_lab_3' (#201) from minhasapov_ruslan_lab_3 into main
Reviewed-on: #201
2024-12-15 12:51:37 +04:00
yasha
10a12d8da0 fadeeva_nastya_laab_8 2024-12-15 08:54:42 +04:00
25b2a2c481 ismailov_rovshan_lab_8 is ready 2024-12-15 07:33:40 +04:00
c699558126 ismailov_rovshan_lab_7 is ready 2024-12-15 07:30:26 +04:00
4226945dca ismailov_rovshan_lab_6 is ready 2024-12-15 07:24:34 +04:00
239da31a0d ismailov_rovshan_lab_5 is ready 2024-12-15 06:47:19 +04:00
693c6bd91d ismailov_rovshan_lab_4 is ready_fix 2024-12-15 05:52:18 +04:00
31c074f6bb ismailov_rovshan_lab_4 is ready 2024-12-15 05:45:25 +04:00
21c4aa5f5e . 2024-12-15 03:37:34 +04:00
yasha
75b27fd1f5 fadeeva_nastya_lab_7 2024-12-15 02:13:35 +04:00
yasha
05293340a3 fadeeva_nastya_lab_6 2024-12-15 01:36:56 +04:00
yasha
ef4acd4ec6 fadeeva_nastya_lab_5 2024-12-15 01:24:02 +04:00
yasha
356bb54247 fadeeva_nastya_lab_4 2024-12-15 01:08:36 +04:00
c9b601dda5 ismailov_rovshan_lab_3 is ready 2024-12-14 02:58:05 +04:00
a3dc157784 ismailov_rovshan_lab_3 is ready 2024-12-14 02:55:05 +04:00
c06d3e291b bondarenko_max_lab_8_is_ready 2024-12-14 02:03:56 +04:00
4c83bd29bf bondarenko_max_lab_7_is_ready 2024-12-14 01:37:52 +04:00
yasha
a3827d5b4b fadeeva_nastya_lab_3 is ready 2024-12-14 01:21:48 +04:00
b64b354a74 bondarenko_max_lab_5_is_ready 2024-12-14 01:13:43 +04:00
8ef7197268 bondarenko_max_lab_6_is_ready 2024-12-14 01:03:28 +04:00
8e5776d104 bondarenko_max_lab_5 2024-12-13 23:52:37 +04:00
25f8ce44eb bondarenko_max_lab_5_is_ready 2024-12-13 23:51:05 +04:00
a25c242bda bondarenko_max_lab_4_is_ready 2024-12-13 22:49:58 +04:00
429ab85f80 bondarenko_max_lab_4_is_ready 2024-12-13 22:46:31 +04:00
681b9b4c00 bondarenko_max_lab_4_is_ready 2024-12-13 22:44:20 +04:00
ae4ba4c88d vasina_ekaterina_lab_8 is ready 2024-12-13 18:41:44 +04:00
91b02cece8 vasina_ekaterina_lab_7 is ready 2024-12-13 18:40:29 +04:00
fb3994fcab vasina_ekaterina_lab_6 is ready 2024-12-13 18:37:07 +04:00
af77bb1076 vasina_ekaterina_lab_4 is ready 2024-12-13 18:16:02 +04:00
3fb0096475 bondarenko_max_lab_4 is done 2024-12-13 05:48:37 +04:00
752036c0ae vasina_ekaterina_lab_3 is ready 2024-12-13 03:02:14 +04:00
yasha
544d4c2714 fadeeva_nastya_lab_2 is ready 2024-12-13 00:31:02 +04:00
5247783708 alkin_ivan_lab_3 2024-12-12 22:44:53 +04:00
7e69d49c4d Revert "alkin_ivan_lab_1"
This reverts commit b38e7552
2024-12-12 22:16:56 +04:00
753e2f6593 Revert "alkin_ivan_lab_1"
This reverts commit ee80d0ffdd.
2024-12-12 22:12:41 +04:00
055bb25d6b novopolcev_alexander_lab_3 is ready 2024-12-11 14:11:10 +04:00
e760640200 bondarenko_max_lab_4 2024-12-10 21:33:59 +04:00
Yana
063b93d78e nikolaeva_yana_lab_3 2024-12-10 20:14:57 +04:00
Yana
44a4ee7eec nikolaeva_yana_lab_2 2024-12-10 19:37:07 +04:00
3df2cc1a48 alkin_ivan_lab_2 2024-12-09 23:56:12 +04:00
8c5f33678e alkin_ivan_lab_2 2024-12-09 23:49:29 +04:00
Никита Чернышов
2cfe26ee1b Chernyshov Nikita Lab1 is Ready 2024-12-09 21:54:17 +04:00
ee80d0ffdd alkin_ivan_lab_1 2024-12-09 21:24:17 +04:00
63854633e1 alkin_ivan_lab_1 2024-12-09 21:05:04 +04:00
b38e755299 alkin_ivan_lab_1 2024-12-09 21:03:02 +04:00
yasha
65121a52d7 fadeeva_nastya_lab_1 is ready 2024-12-08 23:10:06 +04:00
Kseniy
7811d112d9 kurushina_ksenia_lab_3 2024-12-08 22:45:52 +04:00
Kseniy
abea29a111 kurushina_ksenia_lab_3 2024-12-08 22:45:33 +04:00
Kseniy
529b2c8782 kurushina_ksenia_lab_2 2024-12-08 20:55:28 +04:00
db8939f045 kurushina_ksenia_lab_1 is ready 2024-12-05 18:43:39 +04:00
Pavel
219c77a03f putilin_pavel_lab_4 2024-12-05 16:44:57 +04:00
8462ae9c2f nikolaeva_yana_lab_1 is ready 2024-12-04 23:33:28 +04:00
a5a422fc0f kosheev_maksim_lab_7 is ready 2024-12-04 15:01:33 +04:00
a1bca21933 kosheev_maksim_lab_7 is ready 2024-12-04 15:01:16 +04:00
6f030312a7 novopolcev_alexander_lab_2 is ready 2024-12-04 12:12:21 +04:00
2fc7e3e67f novopolcev_alexander_lab_1 is ready 2024-12-04 10:46:19 +04:00
9bbe7b8b53 kosheev_maksim_lab_4 is ready3 2024-12-04 00:28:01 +04:00
0add49368f kosheev_maksim_lab_4 is ready2 2024-12-04 00:27:02 +04:00
41d7a3d8fd kosheev_maksim_lab_4 is ready 2024-12-04 00:21:19 +04:00
bc087de470 Merge pull request 'pupkov_alexey_lab8 is ready' (#200) from pupkov_alexey_lab_8 into main
Reviewed-on: #200
2024-12-03 23:12:44 +04:00
a4cf38e0c5 Merge pull request 'pupkov_alexey_lab7 is ready' (#199) from pupkov_alexey_lab_7 into main
Reviewed-on: #199
2024-12-03 23:12:20 +04:00
7da1307156 Merge pull request 'pupkov_alexey_lab6 is ready' (#198) from pupkov_alexey_lab_6 into main
Reviewed-on: #198
2024-12-03 23:11:57 +04:00
9fd3c9ba1f Merge pull request 'putilin_pavel_lab_1 is ready' (#188) from putilin_pavel_lab_1 into main
Reviewed-on: #188
2024-12-03 23:10:25 +04:00
6ea7581574 Merge pull request 'pupkov_alexey_lab_5' (#197) from pupkov_alexey_lab_5 into main
Reviewed-on: #197
2024-12-03 23:09:31 +04:00
ce3325db81 Merge pull request 'pupkov_alexey_lab4 is ready' (#196) from pupkov_alexey_lab_4 into main
Reviewed-on: #196
2024-12-03 23:09:03 +04:00
22dd0c1a6f Merge pull request 'polevoy_sergey_lab_2' (#195) from polevoy_sergey_lab_2 into main
Reviewed-on: #195
2024-12-03 23:08:36 +04:00
506d1bb364 Merge pull request 'pupkov_alexey_lab3 is ready' (#194) from pupkov_alexey_lab_3 into main
Reviewed-on: #194
2024-12-03 23:06:03 +04:00
d70e738ef0 Merge pull request 'minhasapov_ruslan_lab_2' (#193) from minhasapov_ruslan_lab_2 into main
Reviewed-on: #193
2024-12-03 23:05:37 +04:00
183054d1d4 Merge pull request 'rogashova_ekaterina_lab_4' (#192) from rogashova_ekaterina_lab_4 into main
Reviewed-on: #192
2024-12-03 23:05:12 +04:00
574e9bba1b Merge pull request 'mochalov_danila_lab_8 is ready' (#191) from mochalov_danila_lab_8 into main
Reviewed-on: #191
2024-12-03 23:04:46 +04:00
898f188739 Merge pull request 'morozov_vladimir_lab_8 is ready' (#190) from morozov_vladimir_lab_8 into main
Reviewed-on: #190
2024-12-03 23:04:30 +04:00
8985b761bd Merge pull request 'morozov_vladimir_lab_7 is ready' (#189) from morozov_vladimir_lab_7 into main
Reviewed-on: #189
2024-12-03 23:04:13 +04:00
043da1373f Merge pull request 'agliullov_daniyar_lab_1 is ready' (#187) from agliullov_daniyar_lab_1 into main
Reviewed-on: #187
2024-12-03 23:03:40 +04:00
972d1442f3 Merge pull request 'morozov_vladimir_lab_6 is ready' (#186) from morozov_vladimir_lab_6 into main
Reviewed-on: #186
2024-12-03 23:03:25 +04:00
5b6a3e7971 Merge pull request 'mochalov_danila_lab_7' (#185) from mochalov_danila_lab_7 into main
Reviewed-on: #185
2024-12-03 22:51:07 +04:00
46da8f27b8 Merge pull request 'morozov_vladimir_lab_5 is ready' (#184) from morozov_vladimir_lab_5 into main
Reviewed-on: #184
2024-12-03 22:18:46 +04:00
1dc8fb7ecd Merge pull request 'kosheev_maksim_lab_6' (#182) from kosheev_maksim_lab_6 into main
Reviewed-on: #182
2024-12-03 22:18:04 +04:00
4347288bb2 Merge pull request 'kosheev_maksim_lab_5 is ready' (#180) from kosheev_maksim_lab_5 into main
Reviewed-on: #180
2024-12-03 22:16:59 +04:00
b63718633c Merge pull request 'kadyrov_aydar_lab_8' (#179) from kadyrov_aydar_lab_8 into main
Reviewed-on: #179
2024-12-03 22:16:33 +04:00
46e167424e Merge pull request 'kadyrov_aydar_lab_6' (#177) from kadyrov_aydar_lab_6 into main
Reviewed-on: #177
2024-12-03 22:15:55 +04:00
7002b58201 Восьмая лабораторная готова 2024-12-03 06:39:03 +04:00
a3c467e867 Седьмая лабораторная готова 2024-12-03 04:36:38 +04:00
e7a219301e afanasev_dmitry_lab_8 is ready 2024-12-03 01:24:29 +04:00
bc54fabeb5 afanasev_dmitry_lab_7 is ready 2024-12-03 01:18:16 +04:00
90206c821f afanasev_dmitry_lab_6 is ready 2024-12-03 01:05:19 +04:00
Pavel
f6614533d7 Revert "putilin_pavel_lab_2"
This reverts commit 9808787f27.
2024-12-03 00:00:30 +04:00
Pavel
3ef7c65962 putilin_pavel_lab_3 2024-12-02 23:57:46 +04:00
Pavel
9808787f27 putilin_pavel_lab_2 2024-12-02 23:12:59 +04:00
NAP
e61cfe3336 kadyrov_aydar_lab_6_fix is ready 2024-12-01 21:48:26 +04:00
NAP
b6079c266e kadyrov_aydar_lab_6_fix is ready 2024-12-01 21:45:58 +04:00
7f5ad611b5 Merge pull request 'morozov_vladimir_lab_4 is ready' (#176) from morozov_vladimir_lab_4 into main
Reviewed-on: #176
2024-11-29 15:49:54 +04:00
014088a385 Merge pull request 'kadyrov_aydar_lab_7' (#178) from kadyrov_aydar_lab_7 into main
Reviewed-on: #178
2024-11-29 15:49:07 +04:00
a171fb7572 Merge pull request 'morozov_vladimir_lab_3 is ready' (#175) from morozov_vladimir_lab_3 into main
Reviewed-on: #175
2024-11-29 15:47:09 +04:00
e01e3267c6 Merge pull request 'afanasev_dmitry_lab_5 is ready' (#173) from afanasev_dmitry_lab_5 into main
Reviewed-on: #173
2024-11-29 15:46:43 +04:00
271ce7249c Merge pull request 'afanasev_dmitry_lab_4 is ready' (#172) from afanasev_dmitry_lab_4 into main
Reviewed-on: #172
2024-11-29 15:46:26 +04:00
0887bc1d98 Merge pull request 'kosheev_maksim_lab_2' (#171) from kosheev_maksim_lab_2 into main
Reviewed-on: #171
2024-11-29 10:24:02 +04:00
5dbc6a294b Merge pull request 'bogdanov_dmitry_lab_8' (#167) from bogdanov_dmitry_lab_8 into main
Reviewed-on: #167
2024-11-29 10:23:33 +04:00
df05f3f538 Merge pull request 'bogdanov_dmitry_lab_7' (#166) from bogdanov_dmitry_lab_7 into main
Reviewed-on: #166
2024-11-29 10:00:15 +04:00
06873933fe Merge pull request 'bogdanov_dmitry_lab_6' (#165) from bogdanov_dmitry_lab_6 into main
Reviewed-on: #165
2024-11-29 09:15:13 +04:00
Bazunov Andrew Igorevich
c3b1e9157a ready 2024-11-29 00:24:45 +04:00
Bazunov Andrew Igorevich
69f42f260e ready 2024-11-29 00:23:15 +04:00
6f95e51011 Merge pull request 'pupkov_alexey_lab_2' (#164) from pupkov_alexey_lab_2 into main
Reviewed-on: #164
2024-11-28 23:36:03 +04:00
fd47182372 Merge pull request 'pupkov_alexey_lab_1 is ready' (#163) from pupkov_alexey_lab_1 into main
Reviewed-on: #163
2024-11-28 23:32:11 +04:00
0eb5efa744 Merge pull request 'lazarev_andrey_lab_8' (#162) from lazarev_andrey_lab_8 into main
Reviewed-on: #162
2024-11-28 23:22:02 +04:00
3afc355f7b Merge pull request 'tsukanova_irina_lab_8' (#161) from tsukanova_irina_lab_8 into main
Reviewed-on: #161
2024-11-28 23:19:57 +04:00
2415db91da Merge pull request 'turner_ilya_lab_8' (#160) from turner_ilya_lab_8 into main
Reviewed-on: #160
2024-11-28 23:19:07 +04:00
fbf7be91aa Merge pull request 'turner_ilya_lab_7' (#159) from turner_ilya_lab_7 into main
Reviewed-on: #159
2024-11-28 23:17:38 +04:00
a29f100694 Merge pull request 'kosheev_maksim_lab_1 is ready' (#158) from kosheev_maksim_lab_1 into main
Reviewed-on: #158
2024-11-28 23:12:14 +04:00
3ecd80f83b Merge pull request 'turner_ilya_lab_6' (#157) from turner_ilya_lab_6 into main
Reviewed-on: #157
2024-11-28 23:10:53 +04:00
c22cca92ad Merge pull request 'turner_ilya_lab_5' (#156) from turner_ilya_lab_5 into main
Reviewed-on: #156
2024-11-28 23:09:51 +04:00
b018a2421a Merge pull request 'lazarev_andrey_lab_7' (#155) from lazarev_andrey_lab_7 into main
Reviewed-on: #155
2024-11-28 23:08:11 +04:00
b3c5f51e97 Merge pull request 'turner_ilya_lab_4' (#154) from turner_ilya_lab_4 into main
Reviewed-on: #154
2024-11-28 23:07:56 +04:00
999f80cb33 Merge pull request 'kalyshev_yan_lab_5' (#153) from kalyshev_yan_lab_5 into main
Reviewed-on: #153
2024-11-28 22:45:57 +04:00
16e87abc5b Merge pull request 'mochalov_danila_lab_6' (#152) from mochalov_danila_lab_6 into main
Reviewed-on: #152
2024-11-28 22:43:20 +04:00
ea205f8827 Merge pull request 'tsukanova_irina_lab_7' (#151) from tsukanova_irina_lab_7 into main
Reviewed-on: #151
2024-11-28 22:34:35 +04:00
bdf567195a Merge pull request 'tsukanova_irina_lab_6' (#150) from tsukanova_irina_lab_6 into main
Reviewed-on: #150
2024-11-28 22:22:13 +04:00
Zyzf
cdaa75298a add video and fixes 2024-11-26 19:13:56 +04:00
Zyzf
4390166883 done without video 2024-11-26 19:08:28 +04:00
4c2e646f1a Merge pull request 'lazarev_andrey_lab_6' (#149) from lazarev_andrey_lab_6 into main
Reviewed-on: #149
2024-11-25 21:25:30 +04:00
1cca5bf31f Merge pull request 'kalyshev_yan_lab_4' (#148) from kalyshev_yan_lab_4 into main
Reviewed-on: #148
2024-11-25 21:25:11 +04:00
9e3caec178 Merge pull request 'afanasev_dmitry_lab_3 is ready' (#147) from afanasev_dmitry_lab_3 into main
Reviewed-on: #147
2024-11-25 21:24:01 +04:00
eaaeff7389 Merge pull request 'mochalov_danila_lab_5' (#146) from mochalov_danila_lab_5 into main
Reviewed-on: #146
2024-11-25 21:23:26 +04:00
ce8583c049 Merge pull request 'afanasev_dmitry_lab_2 is ready' (#145) from afanasev_dmitry_lab_2 into main
Reviewed-on: #145
2024-11-25 21:22:02 +04:00
ec1cd5f98c Merge pull request 'lazarev_andrey_lab_5' (#144) from lazarev_andrey_lab_5 into main
Reviewed-on: #144
2024-11-25 21:21:30 +04:00
2e0ffdec18 Merge pull request 'morozov_vladimir_lab_2 is ready' (#143) from morozov_vladimir_lab_2 into main
Reviewed-on: #143
2024-11-25 21:21:12 +04:00
358ae2153c Merge pull request 'afanasev_dmitry_lab_1 is ready' (#142) from afanasev_dmitry_lab_1 into main
Reviewed-on: #142
2024-11-25 21:20:30 +04:00
17594169bf Merge pull request 'lazarev_andrey_lab_4' (#141) from lazarev_andrey_lab_4 into main
Reviewed-on: #141
2024-11-25 21:19:34 +04:00
e065588c61 Merge pull request 'balakhonov_danila_lab_3' (#140) from balakhonov_danila_lab_3 into main
Reviewed-on: #140
2024-11-25 21:18:43 +04:00
94f5db29dc Merge pull request 'artamonova_tatyana_lab_4 is ready' (#139) from artamonova_tatyana_lab_4 into main
Reviewed-on: #139
2024-11-25 21:17:40 +04:00
22cb8b936f Merge pull request 'artamonova_tatyana_lab_3 is ready' (#138) from artamonova_tatyana_lab_3 into main
Reviewed-on: #138
2024-11-25 21:17:24 +04:00
7bd8910fcb Merge pull request 'kalyshev_yan_lab_3' (#137) from kalyshev_yan_lab_3 into main
Reviewed-on: #137
2024-11-25 21:14:13 +04:00
f951a6547f Merge pull request 'presnyakova_victoria_lab5' (#136) from presnyakova_victoria_lab5 into main
Reviewed-on: #136
2024-11-25 21:13:38 +04:00
65de84d901 Merge pull request 'presnyakova_victoria_lab4' (#135) from presnyakova_victoria_lab4 into main
Reviewed-on: #135
2024-11-25 21:13:18 +04:00
5c234ec865 Merge pull request 'presnyakova_victoria_lab_3' (#133) from presnyakova_victoria_lab_3 into main
Reviewed-on: #133
2024-11-25 21:12:53 +04:00
a4dfbe6a81 Merge pull request 'morozov_vladimir_lab_1 is ready' (#132) from morozov_vladimir_lab_1 into main
Reviewed-on: #132
2024-11-25 21:06:31 +04:00
06990fa209 Merge pull request 'mochalov_danila_lab_4' (#131) from mochalov_danila_lab_4 into main
Reviewed-on: #131
2024-11-25 21:05:54 +04:00
f9f85d023f Merge pull request 'Bazunov Andrew Lab 5' (#130) from bazunov_andrew_lab_5 into main
Reviewed-on: #130
2024-11-25 21:05:34 +04:00
3de9ba03c2 Merge pull request 'ismailov_rovshan_lab_1 is ready' (#129) from ismailov_rovshan_lab_1_fix into main
Reviewed-on: #129
2024-11-25 20:59:16 +04:00
a3938f3051 Merge pull request 'kashin_maxim_lab_8' (#128) from kashin_maxim_lab_8 into main
Reviewed-on: #128
2024-11-25 20:58:18 +04:00
f08e5d0ea2 Merge pull request 'kashin_maxim_lab_7' (#127) from kashin_maxim_lab_7 into main
Reviewed-on: #127
2024-11-25 20:57:52 +04:00
77bd667129 Merge pull request 'kashin_maxim_lab_6' (#126) from kashin_maxim_lab_6 into main
Reviewed-on: #126
2024-11-25 20:57:10 +04:00
b92c0ca599 Merge pull request 'turner_ilya_lab_3' (#125) from turner_ilya_lab_3 into main
Reviewed-on: #125
2024-11-25 20:56:30 +04:00
287fb33386 bondarenko_max_lab_3 2024-11-25 02:23:32 +04:00
9ff5b267bc bondarenko_max_lab_3 is done 2024-11-25 02:10:37 +04:00
9d7821b12b gitignore is edited 2024-11-24 18:41:58 +04:00
07a49d9b7b bondarenko_max_lab_2 is done 2024-11-24 18:40:08 +04:00
max karme
8546d15925 karamushko_maxim_lab1 2024-11-22 04:31:14 +04:00
ead1821703 kosheev_maksim_lab_3 is ready 2024-11-21 04:43:58 +04:00
ba0da1d0d4 aleikin_artem_lab4 is ready 2024-11-20 04:52:23 +04:00
ad560d4736 aleikin_artem_lab4 is ready 2024-11-20 04:51:11 +04:00
ed5444768f aleikin_artem_lab4 is ready 2024-11-20 04:47:26 +04:00
f3b2646a1e aleikin_artem_lab4 2024-11-20 04:43:04 +04:00
accd6bf3ee aleikin_artem_lab4 2024-11-20 04:42:55 +04:00
aabcb9cd0b ismailov_rovshan_lab_2 is ready 2024-11-19 01:11:40 +04:00
743c9ebc3c lab 8 done 2024-11-18 19:07:56 +04:00
f8750da593 lab 7 done 2024-11-18 18:56:40 +04:00
d91622551e lab 6 done 2024-11-18 18:50:31 +04:00
9995db128b lab 6 done 2024-11-18 18:49:38 +04:00
f70c507b05 Шестая лабораторная готова 2024-11-18 17:08:58 +04:00
715d3aed42 Готово 2024-11-18 15:39:05 +04:00
56094094e4 Готово 2024-11-18 14:20:48 +04:00
c406c5bfb5 Пятая лабораторная готова 2024-11-18 13:32:23 +04:00
c0d126982f Готово 2024-11-18 10:50:25 +04:00
1b7e6aaa75 minhasapov_ruslan_lab_8 2024-11-18 07:39:36 +04:00
729994bd69 minhasapov_ruslan_lab_8 2024-11-18 07:35:52 +04:00
0126669fcf minhasapov_ruslan_lab_7 2024-11-18 06:50:13 +04:00
17d5f3321a minhasapov_ruslan_lab_6 2024-11-18 05:37:56 +04:00
b3c516e6c1 minhasapov_ruslan_lab_5 2024-11-18 02:27:55 +04:00
7546199b38 kosheev_maksim_lab_5 video 2024-11-18 02:06:09 +04:00
4581b18842 kosheev_maksim_lab_6 video 2024-11-18 01:44:54 +04:00
877d246bb5 minhasapov_ruslan_lab_4 2024-11-18 01:14:26 +04:00
db3d13a606 minhasapov_ruslan_lab_4 2024-11-18 01:10:21 +04:00
2308bf7b72 Четвертая лабораторная готова 2024-11-18 01:00:11 +04:00
9915587ada artamonova_tatyana_lab_8 is ready 2024-11-17 22:30:37 +04:00
31381ab310 artamonova_tatyana_lab_7 is ready 2024-11-17 22:03:15 +04:00
e0a2b5991a artamonova_tatyana_lab_6 is ready 2024-11-17 21:26:10 +04:00
224878be45 artamonova_tatyana_lab_5 is ready 2024-11-17 20:03:47 +04:00
ea2cfbc71b Готово 2024-11-17 19:09:56 +04:00
75e377a2db Третья лабораторная готова 2024-11-17 08:32:19 +04:00
fc6efda0c2 minhasapov_ruslan_lab_3 2024-11-17 08:07:00 +04:00
5296d03657 pupkov_alexey_lab8 is ready 2024-11-17 00:09:30 +03:00
54c09fd553 pupkov_alexey_lab7 is ready 2024-11-17 00:07:16 +03:00
6c27ae0efe pupkov_alexey_lab6 is ready 2024-11-16 23:59:37 +03:00
320615a6c6 pupkov_alexey_lab5 2024-11-16 23:47:02 +03:00
44059e8498 pupkov_alexey_lab3 is ready changed link 2024-11-16 23:33:45 +03:00
d90f748a00 pupkov_alexey_lab4 is ready 2024-11-16 23:12:02 +03:00
837af682e2 Исправления ошибок 2024-11-16 23:03:59 +04:00
fd88e38976 Вторая лабораторная готова 2024-11-16 23:02:15 +04:00
b3916786c1 pupkov_alexey_lab3 is ready 2024-11-16 21:33:29 +03:00
b56a8a8c57 minhasapov_ruslan_lab_2 is ready 2024-11-16 21:42:21 +04:00
ff99375ec7 Готово 2024-11-15 11:50:03 +04:00
9b878c442e mochalov_danila_lab_8 is ready 2024-11-15 02:50:38 +04:00
607c741d12 morozov_vladimir_lab_8 2024-11-14 22:39:23 +04:00
58a6d4c4b4 morozov_vladimir_lab_7 2024-11-14 22:14:20 +04:00
dc4315d87b putilin_pavel_lab_1 is ready 2024-11-14 21:59:21 +04:00
27b75d1fc8 putilin_pavel_lab_1 2024-11-14 21:51:46 +04:00
Darya
a99c58df28 agliullov_daniyar_lab_1 2024-11-14 21:39:53 +04:00
c182c28c15 morozov_vladimir_lab_6 2024-11-14 20:40:46 +04:00
0021d41166 mochalov_danila_lab_7 is ready 2024-11-14 17:22:28 +04:00
74a03658f9 morozov_vladimir_lab_5 is ready 2024-11-13 21:27:51 +04:00
ff8adac44c kosheev_maksim_lab_6 is ready 2024-11-13 19:30:41 +04:00
4ad5ec7f72 kosheev_maksim_lab_6 is ready 2024-11-13 19:29:40 +04:00
54e6fe2e82 kosheev_maksim_lab_5 is ready 2024-11-13 16:26:23 +04:00
NAP
44d1f90774 kadyrov_aydar_lab_8 2024-11-12 22:59:57 +04:00
NAP
cc6705ffd6 kadyrov_aydar_lab_7 2024-11-12 22:55:00 +04:00
NAP
da69a995e6 kadyrov_aydar_lab_6 2024-11-12 22:48:48 +04:00
553d25ee56 morozov_vladimir_lab_4 is ready 2024-11-12 22:29:39 +04:00
c8b1741166 morozov_vladimir_lab_3 is ready 2024-11-12 22:23:55 +04:00
d8356af421 afanasev_dmitry_lab_5 is ready 2024-11-12 03:14:05 +04:00
b9f604b3c1 afanasev_dmitry_lab_4 is ready 2024-11-12 02:21:31 +04:00
88e8fd7b6a kosheev_maksim_lab_2 is ready_2 2024-11-11 23:36:39 +04:00
20acae9135 kosheev_maksim_lab_2 is ready 2024-11-11 23:34:00 +04:00
the
aa571e03dc Lab8 2024-11-11 13:41:38 +04:00
the
64a82977ac small fix 2024-11-11 13:04:46 +04:00
the
70653dcf6e Lab7 2024-11-11 13:03:52 +04:00
the
672cc9e867 lab 6 2024-11-11 12:42:11 +04:00
c11c59ce01 почему то в прошлый раз выгрузилась не актуальная версия 2024-11-11 07:47:55 +04:00
0a822fc3e5 pupkov_alexey_lab_2 is ready 2024-11-11 00:27:27 +03:00
80868d745f pupkov_alexey_lab_1 is ready 2024-11-10 23:19:06 +03:00
4db2045e7f lazarev_andrey_lab_8 2024-11-10 21:01:36 +04:00
f987854c2b лаба 8 2024-11-10 20:59:28 +04:00
a4dbadbd2f turner_ilya_lab_8 is ready 2024-11-10 20:48:26 +04:00
b454ad2bcc turner_ilya_lab_7 is ready 2024-11-10 19:43:50 +04:00
447590cbb5 kosheev_maksim_lab_1 is ready 2024-11-10 18:23:44 +04:00
b70ce2a9af turner_ilya_lab_6 is ready 2024-11-10 18:00:17 +04:00
26fed46443 turner_ilya_lab_5 is ready 2024-11-10 13:52:54 +04:00
a0ca1e8f4f lazarev_andrey_lab_7 2024-11-10 02:24:30 +04:00
d9b71068d8 turner_ilya_lab_4 is ready 2024-11-09 21:38:27 +04:00
Zyzf
63c998bcf0 add video 2024-11-08 21:34:45 +04:00
Zyzf
e4080abb6a clean branch 2024-11-08 21:31:13 +04:00
Zyzf
dd0d4e53c4 done 2024-11-08 21:25:22 +04:00
992427dda4 mochalov_danila_lab_6 is ready 2024-11-08 20:55:07 +04:00
96ca1c6d16 lab7 2024-11-08 16:19:50 +04:00
d24d5be799 done 2024-11-08 14:45:23 +04:00
059a3cc811 lazarev_andrey_lab_6 2024-11-08 01:13:53 +04:00
Zyzf
07eb35b6b9 done 2024-11-08 01:04:56 +04:00
f944b01cca лаба 6 2024-11-07 16:33:18 +04:00
63f09a3c0b лаба 6 2024-11-07 16:32:56 +04:00
0e7013bf28 afanasev_dmitry_lab_2 is ready 2024-11-07 02:54:45 +04:00
a939a84307 afanasev_dmitry_lab_3 is ready 2024-11-07 02:52:34 +04:00
6fdc64cc1f readme fix 2024-11-06 02:59:28 +04:00
4ab74fbd57 mochalov_danila_lab_5_is_ready 2024-11-06 02:56:57 +04:00
e28a89e71e readme fix 2024-11-05 22:41:01 +04:00
8186f826c3 lazarev_andrey_lab_5 2024-11-05 22:38:45 +04:00
cb141cc4e7 morozov_vladimir_lab_2 is ready 2024-11-05 20:48:50 +04:00
cd438c3d61 afanasev_dmitry_lab_1 is ready 2024-11-05 16:21:13 +04:00
08b8a6f487 lazarev_andrey_lab_4 2024-11-04 02:01:55 +04:00
56e663d772 добавлен ридми 2024-11-04 01:34:14 +04:00
27daaeb0aa исправлен конфиг нджинкса 2024-11-04 01:34:00 +04:00
a9461abeb5 artamonova_tatyana_lab_4 is ready 2024-11-04 01:31:41 +04:00
54157ec2bf небольшая добавка чтоб понять что происходит вообще... 2024-11-04 00:42:54 +04:00
54e0f8d8f3 может быть... сейчас? 2024-11-03 23:47:31 +04:00
4b5baf4272 извините у меня голова уже плывет 2024-11-03 22:47:46 +04:00
e295c3fa5f заходит как-то в бар чебурашка с чемоданом 2024-11-03 22:38:30 +04:00
8f2a9c126c работай!!!!!!!! 2024-11-03 22:31:00 +04:00
97c7b71067 ну и ну 2024-11-03 22:17:59 +04:00
1ee9e2c3fb последний рывок 2024-11-03 22:15:01 +04:00
df3af5e2cd сдаюсь 2024-11-03 21:41:01 +04:00
14338ff5ac еще разок попытаем удачу 2024-11-03 20:51:32 +04:00
c89b6ebb57 artamonova_tatyana_lab_3 is ready 2024-11-03 20:37:42 +04:00
74e61987dc еще разок 2024-11-03 20:30:29 +04:00
4fc879212e эээ... 2024-11-03 20:15:43 +04:00
e8cf19d932 ой беда 2024-11-03 19:31:46 +04:00
c46ade29f9 жесть позор 2024-11-03 19:22:37 +04:00
048453ed2f первая попытка 2024-11-03 19:18:40 +04:00
Zyzf
a02eb5e9d9 done 2024-11-02 20:14:47 +04:00
1331b40dcf lab 5 done 2024-11-02 18:57:36 +04:00
fe8a57dc0d lab 4 done 2024-11-01 21:02:03 +04:00
9c9dfde6dc lab 3 done 2024-11-01 19:10:39 +04:00
018a64ff09 morozov_vladimir_lab_1 is ready 2024-11-01 15:45:20 +04:00
f0b4e6d172 mochalov_danila_lab_4 is ready 2024-10-30 20:28:03 +04:00
Zyzf
e3390d53dd init 2024-10-30 13:57:42 +04:00
201eb8f79e Merge branch 'main' into bondarenko_max_lab_2 2024-10-29 02:33:15 +04:00
115085bb88 code is complete 2024-10-29 02:32:40 +04:00
Bazunov Andrew Igorevich
4b86dfd750 complete lab 2024-10-28 22:27:53 +04:00
9d12336abe ismailov_rovshan_lab_1 is ready
Исправлен конфликт
2024-10-27 22:20:11 +04:00
eddd99b94d Готово 2024-10-27 20:19:04 +04:00
aa62ce56db Готово 2024-10-27 20:11:39 +04:00
6baa4ddabe Готово 2024-10-27 20:01:01 +04:00
f698c1fc72 turner_ilya_lab_3 is ready 2024-10-27 19:51:36 +04:00
5ff5bf22b1 lab 3 no swagger 2024-10-10 22:53:30 +04:00
1013 changed files with 28976 additions and 0 deletions

57
.gitignore vendored Normal file
View File

@ -0,0 +1,57 @@
################################################################################
# Данный GITIGNORE-файл был автоматически создан Microsoft(R) Visual Studio.
################################################################################
/.vs/DAS_2024_1
/.vs
/aleikin_artem_lab_3/.vs
/aleikin_artem_lab_3/ProjectEntityProject/bin/Debug/net8.0
/aleikin_artem_lab_3/ProjectEntityProject/obj
/aleikin_artem_lab_3/TaskProject/bin/Debug/net8.0
/aleikin_artem_lab_3/TaskProject/obj/Container
/aleikin_artem_lab_3/TaskProject/obj
/aleikin_artem_lab_4/RVIPLab4/.vs
/aleikin_artem_lab_4/RVIPLab4/Consumer1/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/Consumer1/obj
/aleikin_artem_lab_4/RVIPLab4/Consumer2/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/Consumer2/obj
/aleikin_artem_lab_4/RVIPLab4/FirstTutorial/Receive/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/FirstTutorial/Receive/obj
/aleikin_artem_lab_4/RVIPLab4/FirstTutorial/Send/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/FirstTutorial/Send/obj
/aleikin_artem_lab_4/RVIPLab4/Publisher/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/Publisher/obj
/aleikin_artem_lab_4/RVIPLab4/SecondTutorial/NewTask/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/SecondTutorial/NewTask/obj
/aleikin_artem_lab_4/RVIPLab4/SecondTutorial/Worker/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/SecondTutorial/Worker/obj
/aleikin_artem_lab_4/RVIPLab4/ThirdTutorial/EmitLog/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/ThirdTutorial/EmitLog/obj
/aleikin_artem_lab_4/RVIPLab4/ThirdTutorial/ReceiveLogs/bin/Debug/net8.0
/aleikin_artem_lab_4/RVIPLab4/ThirdTutorial/ReceiveLogs/obj
/dozorova_alena_lab_2
/dozorova_alena_lab_3
/dozorova_alena_lab_4
/dozorova_alena_lab_5/ConsoleApp1/obj
/dozorova_alena_lab_6/ConsoleApp1/obj
/aleikin_artem_lab_4/RVIPLab4/RVIPLab4.sln
/aleikin_artem_lab_4/.vs
/aleikin_artem_lab_4/Consumer1/bin/Debug/net8.0
/aleikin_artem_lab_4/Consumer1/obj
/aleikin_artem_lab_4/Consumer2/bin/Debug/net8.0
/aleikin_artem_lab_4/Consumer2/obj
/aleikin_artem_lab_4/FirstTutorial/Receive/bin/Debug/net8.0
/aleikin_artem_lab_4/FirstTutorial/Receive/obj
/aleikin_artem_lab_4/FirstTutorial/Send/bin/Debug/net8.0
/aleikin_artem_lab_4/FirstTutorial/Send/obj
/aleikin_artem_lab_4/Publisher/bin/Debug/net8.0
/aleikin_artem_lab_4/Publisher/obj
/aleikin_artem_lab_4/SecondTutorial/NewTask/bin/Debug/net8.0
/aleikin_artem_lab_4/SecondTutorial/NewTask/obj
/aleikin_artem_lab_4/SecondTutorial/Worker/bin/Debug/net8.0
/aleikin_artem_lab_4/SecondTutorial/Worker/obj
/aleikin_artem_lab_4/ThirdTutorial/EmitLog/bin/Debug/net8.0
/aleikin_artem_lab_4/ThirdTutorial/EmitLog/obj
/aleikin_artem_lab_4/ThirdTutorial/ReceiveLogs/bin/Debug/net8.0
/aleikin_artem_lab_4/ThirdTutorial/ReceiveLogs/obj
/aleikin_artem_lab_4/RVIPLab4.sln

View File

@ -0,0 +1,44 @@
# Лабораторная работа 1
## Описание
Данная лабораторная работа предназначена для настройки 3 сервисов — **Gitea**, **Redmine** и БД **MySQL**с использованием Docker Compose. **Gitea** — это лёгкая система контроля версий с веб-интерфейсом, а **Redmine** — система управления проектами и задачами, а также баг-трекер. **MySQL** — база данных, используемая Redmine для хранения данных.
## Запуск проекта
1. Убедитесь, что у вас установлены **Docker** и **Docker Compose**.
2. Клонируйте репозиторий с данным проектом или создайте файл `docker-compose.yml` с конфигурацией, представленной там.
3. В командной строке перейдите в директорию с файлом `docker-compose.yml`.
4. Запустите команды:
```bash
docker-compose up -d
```
Эта команда запустит контейнеры в фоновом режиме.
5. После запуска:
- Gitea будет доступен по адресу: [http://localhost:3000](http://localhost:3000)
- Redmine будет доступен по адресу: [http://localhost:8080](http://localhost:8080)
## Конфигурация
В файле `docker-compose.yml` определены следующие сервисы:
- **Gitea**:
- Запускается из официального образа `gitea/gitea:latest`.
- Использует `SQLite` для хранения данных.
- Настроен на порту 3000 для веб-доступа и 2222 для SSH.
- **Redmine**:
- Запускается из официального образа `redmine`.
- Подключен к базе данных MySQL.
- Доступен на порту 8080.
- **MySQL**:
- Запускается из образа `mysql:8.0`.
- Используется Redmine для хранения данных.
- Настроен с дефолтными пользователем, базой и паролем.
## Остановка проекта
Для остановки контейнеров запустите:
```bash
docker-compose down
```
Это завершит работу всех контейнеров и освободит порты.
## Примечания
- При необходимости вы можете изменить порты или другие параметры, отредактировав файл `docker-compose.yml`.
- Данные хранятся в именованных томах `gitea_data` и `db_data`, что позволяет сохранять данные при перезапуске контейнеров.
- Ссылка на демонстрацию работы программы: https://vk.com/video215756667_456239451?list=ln-AMZSRDejYptijuOt9u

View File

@ -0,0 +1,46 @@
version: '3.9' # Версия Docker Compose
services:
# Gitea сервис
gitea:
image: gitea/gitea:latest # Образ Gitea для запуска сервиса
container_name: gitea # Имя контейнера для удобства
environment: # Переменные среды
USER_UID: 1000 # UID пользователя внутри контейнера
USER_GID: 1000 # GID пользователя внутри контейнера
GITEA__database__DB_TYPE: sqlite3 # Тип бд (SQLite для простоты)
GITEA__database__PATH: /data/gitea/gitea.db # Путь к базе данных
GITEA__server__ROOT_URL: http://localhost:3000 # URL для доступа
GITEA__server__HTTP_PORT: 3000 # Порт для веб-интерфейса
volumes:
- gitea_data:/data # Монтирование директории данных для сохранения данных
ports:
- "3000:3000" # Порт для доступа к веб-интерфейсу Gitea
- "2222:22" # SSH порт для клонирования репозиториев
restart: always # Автоматический перезапуск контейнера в случае сбоя
# Redmine сервис
redmine:
image: redmine # Образ Redmine для запуска сервиса
restart: always # Автоматический перезапуск контейнера
ports:
- 8080:3000 # Порт для доступа к веб-интерфейсу
environment: # Переменные среды
REDMINE_DB_MYSQL: db # Имя хоста бд для подключения
REDMINE_DB_PASSWORD: example # Пароль для подключения к базе данных
# MySQL база данных для Redmine
db:
image: mysql:8.0 # Образ MySQL для бд
restart: always # Автоматический перезапуск контейнера
environment: # Переменные среды
MYSQL_ROOT_PASSWORD: example # Пароль пользователя root для MySQL
MYSQL_DATABASE: redmine # Имя бд для Redmine
MYSQL_USER: user # Пользователь MySQL
MYSQL_PASSWORD: password # Пароль для пользователя MySQL
volumes:
- db_data:/var/lib/mysql # Монтирование для сохранения данных бд
volumes: # Именованные тома
gitea_data: # Том для данных Gitea
db_data: # Том для данных MySQL

92
afanasev_dmitry_lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,92 @@
data/
##############################
## Java
##############################
.mtj.tmp/
*.class
*.jar
*.war
*.ear
*.nar
hs_err_pid*
replay_pid*
##############################
## Maven
##############################
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
pom.xml.bak
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
##############################
## Gradle
##############################
bin/
build/
.gradle
.gradletasknamecache
gradle-app.setting
!gradle-wrapper.jar
##############################
## IntelliJ
##############################
out/
.idea/
.idea_modules/
*.iml
*.ipr
*.iws
##############################
## Eclipse
##############################
.settings/
bin/
tmp/
.metadata
.classpath
.project
*.tmp
*.bak
*.swp
*~.nib
local.properties
.loadpath
.factorypath
##############################
## NetBeans
##############################
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml
##############################
## Visual Studio Code
##############################
.vscode/
.code-workspace
##############################
## OS X
##############################
.DS_Store
##############################
## Miscellaneous
##############################
*.log

View File

@ -0,0 +1,38 @@
# Лабораторная работа 2
## Описание
Данная лабораторная работа предназначена для настройки 2 сервисов (простейшего распределенного приложения) с использованием Docker Compose. **FirstService** — ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt. **SecondService** — ищет наименьшее число из файла /var/result/data.txt (сгенерирован 1-ым сервисом) и сохраняет его третью степень в /var/result/result.txt.
## Запуск проекта
1. Убедитесь, что у вас установлены **Docker** и **Docker Compose**.
2. Клонируйте репозиторий с данным проектом.
3. В командной строке перейдите в директорию с файлом `docker-compose.yml`.
4. Запустите команды:
```bash
docker-compose up -d
```
Эта команда запустит контейнеры в фоновом режиме.
5. После запуска:
- Посмотреть логи первого сервиса о том, что файл создался успешно.
- Посмотреть логи второго сервиса о том, что он обработал созданный первым сервисом файл.
## Конфигурация
В файле `docker-compose.yml` определены следующие сервисы:
- **FirstService**:
- Создает образ из директории `firstService`.
- Использует локальную директорию `/var/data` и общую `/var/result` для хранения данных.
- **SecondService**:
- Создает образ из директории `secondService`.
- Использует общую `/var/result` директорию для хранения данных.
- Запускается после первого сервиса.
## Остановка проекта
Для остановки контейнеров запустите:
```bash
docker-compose down
```
Это завершит работу всех контейнеров.
## Примечания
- При необходимости можно изменить директорию с данными или другие параметры, отредактировав файл `docker-compose.yml`.
- Ссылка на демонстрацию работы программы: https://vk.com/video215756667_456239452?list=ln-rAyQWJj8q7ezqCaZzL

View File

@ -0,0 +1,17 @@
version: '3.9'
services:
first-service:
build: ./firstService # Путь к докер-файлу 1 приложения
volumes:
- D:/java/DAS_2024_1/afanasev_dmitry_lab_2/data:/var/data # Монтируем директорию с данными
- common-volume:/var/result # Монтируем общую директорию (нужна 2-му сервису для работы)
second-service:
build: ./secondService # Путь к докер-файлу 2 приложения
volumes:
- common-volume:/var/result # Монтируем общую директорию (нужна 2-му сервису для работы)
depends_on:
- first-service # Запуск после первого сервиса
volumes: # Именованные тома
common-volume: # Общий для 2-ух сервисов

View File

@ -0,0 +1,17 @@
# Используем образ с Java 17
FROM bellsoft/liberica-openjdk-alpine:17.0.8
# Создаем директорию для исходных файлов
RUN mkdir /var/data
# Создаем директорию для приложения
WORKDIR /app
# Копируем файлы приложения в контейнер
COPY src /app/src
# Компилируем приложение
RUN javac /app/src/FirstService.java
# Определяем команду для запуска приложения
CMD ["java", "-cp", "/app/src", "FirstService"]

View File

@ -0,0 +1,52 @@
import java.io.*;
import java.nio.file.*;
public class FirstService {
// 1. Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt.
public static void main(String[] args) {
Path sourceDir = Paths.get("/var/data");
Path destinationDir = Paths.get("/var/result");
Path destinationFile = destinationDir.resolve("data.txt");
Path largestFile = null;
long maxLineCount = 0;
try {
// существует ли каталог /var/result, если нет, создаем
if (!Files.exists(destinationDir)) {
Files.createDirectories(destinationDir);
} else {
// иначе чистим
try (DirectoryStream<Path> stream = Files.newDirectoryStream(destinationDir)) {
for (Path file : stream) {
Files.delete(file);
}
}
}
// поиск файла с наибольшим количеством строк в каталоге /var/data
try (DirectoryStream<Path> stream = Files.newDirectoryStream(sourceDir)) {
for (Path file : stream) {
if (Files.isRegularFile(file)) {
long lineCount = Files.lines(file).count();
if (lineCount > maxLineCount) {
maxLineCount = lineCount;
largestFile = file;
}
}
}
}
// копируем файл с наибольшим количеством строк в /var/result/data.txt
if (largestFile != null) {
Files.copy(largestFile, destinationFile, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Файл " + largestFile + " скопирован в " + destinationFile);
} else {
System.out.println("В каталоге " + sourceDir + " нет файлов.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,17 @@
# Используем образ с Java 17
FROM bellsoft/liberica-openjdk-alpine:17.0.8
# Создаем директорию для исходных файлов
RUN mkdir /var/data
# Создаем директорию для приложения
WORKDIR /app
# Копируем файлы приложения в контейнер
COPY src /app/src
# Компилируем приложение
RUN javac /app/src/SecondService.java
# Определяем команду для запуска приложения
CMD ["java", "-cp", "/app/src", "SecondService"]

View File

@ -0,0 +1,51 @@
import java.io.*;
import java.nio.file.*;
import java.util.*;
public class SecondService {
// 2. Ищет наименьшее число из файла /var/result/data.txt и сохраняет его третью степень в /var/result/result.txt.
public static void main(String[] args) {
Path sourceFile = Paths.get("/var/result/data.txt");
Path destinationDir = Paths.get("/var/result");
Path destinationFile = destinationDir.resolve("result.txt");
try {
// создание /var/result, если не существует
if (!Files.exists(destinationDir)) {
Files.createDirectories(destinationDir);
}
// читаем числа из файла и находим наименьшее
List<Integer> numbers = new ArrayList<>();
try (BufferedReader reader = Files.newBufferedReader(sourceFile)) {
String line;
while ((line = reader.readLine()) != null) {
try {
numbers.add(Integer.parseInt(line.trim()));
} catch (NumberFormatException e) {
System.out.println("Некорректная строка: " + line);
}
}
}
if (!numbers.isEmpty()) {
// находим наименьшее число и его третью степень
int minNumber = Collections.min(numbers);
int minNumberCubed = (int) Math.pow(minNumber, 3);
// записываем результат в /var/result/result.txt
try (BufferedWriter writer = Files.newBufferedWriter(destinationFile)) {
writer.write(String.valueOf(minNumberCubed));
System.out.println("Третья степень наименьшего числа - " + minNumber + " (" + minNumberCubed +
") сохранена в " + destinationFile);
}
} else {
System.out.println("Файл " + sourceFile + " пуст или не содержит чисел.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,41 @@
# Лабораторная работа 3
## Описание
Данная лабораторная работа предназначена для настройки 3 сервисов — **Melon**, **Water** и прокси-сервер **Nginx**с использованием Docker Compose. **Melon** — сервис с дынями, где для каждого свой арбуз, а **Water** — сервис с водой и связанных с ними арбузами. **Nginx** — прокси-сервер, работающий на Unix-подобных операционных системах.
## Запуск проекта
1. Убедитесь, что у вас установлены **Docker** и **Docker Compose**.
2. Клонируйте репозиторий с данным проектом.
3. В командной строке перейдите в директорию с файлом `docker-compose.yml`.
4. Запустите команды:
```bash
docker-compose up -d
```
Эта команда запустит контейнеры в фоновом режиме.
5. После запуска:
- Melon будет доступен по адресу: [http://localhost:8080](http://localhost:8080)
- Water будет доступен по адресу: [http://localhost:8081](http://localhost:8081)
## Конфигурация
В файле `docker-compose.yml` определены следующие сервисы:
- **Melon**:
- Настроен на порту 8080 для веб-доступа.
- Обращается к **Nginx** для доступа к сервису **Water**.
- Реализует базовые CRUD-операции.
- **Water**:
- Настроен на порту 8081 для веб-доступа.
- Реализует базовые CRUD-операции.
- **Nginx**:
- Запускается из образа `nginx`.
- Используется для проксирования запросов.
## Остановка проекта
Для остановки контейнеров запустите:
```bash
docker-compose down
```
Это завершит работу всех контейнеров и освободит порты.
## Примечания
- При необходимости вы можете изменить порты или другие параметры, отредактировав файл `docker-compose.yml`.
- Ссылка на демонстрацию работы программы: https://vk.com/video215756667_456239453?list=ln-6zVfNOSwMQtpVWKkGe

View File

@ -0,0 +1,25 @@
version: '3.9'
services:
melon:
build: ./melon
ports:
- "8080:8080"
expose: # Указывает, какой порт будет открыт внутри контейнера
- 8080
water:
build: ./water
ports:
- "8081:8081"
expose: # Указывает, какой порт будет открыт внутри контейнера
- 8081
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- melon
- water

View File

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
afanasev_dmitry_lab_3/melon/.gitignore vendored Normal file
View File

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

View File

@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

View File

@ -0,0 +1,4 @@
FROM bellsoft/liberica-openjdk-alpine:17.0.8
ADD target/melon-0.0.1-SNAPSHOT.jar /app/
CMD ["java", "-Xmx200m", "-jar", "/app/melon-0.0.1-SNAPSHOT.jar"]
WORKDIR /app

259
afanasev_dmitry_lab_3/melon/mvnw vendored Normal file
View File

@ -0,0 +1,259 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.2
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
if [ -n "${JAVA_HOME-}" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
trim() {
# MWRAPPER-139:
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
# Needed for removing poorly interpreted newline sequences when running in more
# exotic environments such as mingw bash on Windows.
printf "%s" "${1}" | tr -d '[:space:]'
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl=$(trim "${value-}") ;;
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"

149
afanasev_dmitry_lab_3/melon/mvnw.cmd vendored Normal file
View File

@ -0,0 +1,149 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>ru.ulstu</groupId>
<artifactId>melon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>melon</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,13 @@
package ru.ulstu.melon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MelonApplication {
public static void main(String[] args) {
SpringApplication.run(MelonApplication.class, args);
}
}

View File

@ -0,0 +1,13 @@
package ru.ulstu.melon.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

View File

@ -0,0 +1,54 @@
package ru.ulstu.melon.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.ulstu.melon.dto.CreateMelonDto;
import ru.ulstu.melon.dto.MelonDto;
import ru.ulstu.melon.dto.UpdateMelonDto;
import ru.ulstu.melon.model.Melon;
import ru.ulstu.melon.service.MelonService;
import java.util.Collection;
import java.util.UUID;
@RestController
@RequiredArgsConstructor
@RequestMapping("/melon")
public class MelonController {
private final MelonService melonService;
@GetMapping
public ResponseEntity<Collection<Melon>> get() {
return new ResponseEntity<>(melonService.get(), HttpStatus.OK);
}
@GetMapping("/{id}")
public ResponseEntity<MelonDto> get(@PathVariable UUID id) {
return new ResponseEntity<>(melonService.get(id), HttpStatus.OK);
}
@PostMapping
public ResponseEntity<MelonDto> add(@RequestBody CreateMelonDto dto) {
return new ResponseEntity<>(melonService.add(dto), HttpStatus.OK);
}
@PutMapping("/{id}")
public ResponseEntity<MelonDto> update(@PathVariable UUID id, @RequestBody UpdateMelonDto dto) {
return new ResponseEntity<>(melonService.update(id, dto), HttpStatus.OK);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable UUID id) {
melonService.delete(id);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@ -0,0 +1,14 @@
package ru.ulstu.melon.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.UUID;
@AllArgsConstructor
@Getter
public class CreateMelonDto {
private Boolean isRipe;
private Double weight;
private UUID waterMelonId;
}

View File

@ -0,0 +1,28 @@
package ru.ulstu.melon.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import ru.ulstu.melon.model.Melon;
import ru.ulstu.melon.model.Water;
import java.util.UUID;
@AllArgsConstructor
@Getter
@Setter
public class MelonDto {
private UUID id;
private Boolean isRipe;
private Double weight;
private UUID waterMelonId;
private WaterDto waterMelon;
public MelonDto(Melon melon, Water water) {
this.id = melon.getId();
this.isRipe = melon.getIsRipe();
this.weight = melon.getWeight();
this.waterMelonId = melon.getWaterMelonId();
this.waterMelon = new WaterDto(water);
}
}

View File

@ -0,0 +1,11 @@
package ru.ulstu.melon.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public class UpdateMelonDto {
private Boolean isRipe;
private Double weight;
}

View File

@ -0,0 +1,23 @@
package ru.ulstu.melon.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import ru.ulstu.melon.model.Water;
import java.util.UUID;
@Getter
@Setter
@AllArgsConstructor
public class WaterDto {
private UUID id;
private Boolean isSweetBottom;
private Double volume;
public WaterDto(Water water) {
this.id = water.getId();
this.isSweetBottom = water.getIsSweetBottom();
this.volume = water.getVolume();
}
}

View File

@ -0,0 +1,19 @@
package ru.ulstu.melon.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.UUID;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Melon {
private UUID id;
private Boolean isRipe;
private Double weight;
private UUID waterMelonId;
}

View File

@ -0,0 +1,18 @@
package ru.ulstu.melon.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.UUID;
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Water {
private UUID id;
private Boolean isSweetBottom;
private Double volume;
private List<Melon> waterMelons;
}

View File

@ -0,0 +1,88 @@
package ru.ulstu.melon.service;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.server.ResponseStatusException;
import ru.ulstu.melon.dto.CreateMelonDto;
import ru.ulstu.melon.dto.MelonDto;
import ru.ulstu.melon.dto.UpdateMelonDto;
import ru.ulstu.melon.model.Melon;
import ru.ulstu.melon.model.Water;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class MelonService {
private final Map<UUID, Melon> melons = new HashMap<>();
private final RestTemplate restTemplate;
private static final String WATER_SERVICE_PATH = "http://nginx/water/water/";
public Collection<Melon> get() {
return melons.values();
}
public MelonDto get(UUID id) {
if (!melons.containsKey(id)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Melon not found");
}
final Melon melon = melons.get(id);
return new MelonDto(melon, getWater(melon.getWaterMelonId()));
}
public MelonDto add(CreateMelonDto dto) {
Melon melon = new Melon(UUID.randomUUID(),
dto.getIsRipe(),
dto.getWeight(),
dto.getWaterMelonId());
melons.put(melon.getId(), melon);
Water water;
try {
String baseUrl = WATER_SERVICE_PATH + melon.getWaterMelonId() + "/addMelon";
water = restTemplate.postForObject(
baseUrl,
melon,
Water.class
);
} catch (RestClientException e) {
throw new RuntimeException("Failed to add melon to waterMelons: " + e.getMessage(), e);
}
return new MelonDto(melon, water);
}
public MelonDto update(UUID id, UpdateMelonDto dto) {
if (!melons.containsKey(id)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Melon not found");
}
Melon melon = melons.get(id);
if (dto.getWeight() != null)
melon.setWeight(dto.getWeight());
if (dto.getIsRipe() != null)
melon.setIsRipe(dto.getIsRipe());
return new MelonDto(melon, getWater(melon.getWaterMelonId()));
}
public void delete(UUID id) {
if (!melons.containsKey(id)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Melon not found");
}
melons.remove(id);
}
private Water getWater(UUID id) {
Water water;
try {
String baseUrl = WATER_SERVICE_PATH + id;
water = restTemplate.getForEntity(baseUrl, Water.class).getBody();
} catch (RestClientException e) {
throw new RuntimeException("Failed get waterMelon for melon: " + e.getMessage());
}
return water;
}
}

View File

@ -0,0 +1 @@
spring.application.name=melon

View File

@ -0,0 +1,13 @@
package ru.ulstu.melon;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MelonApplicationTests {
@Test
void contextLoads() {
}
}

View File

@ -0,0 +1,19 @@
events {
worker_connections 1024;
}
http {
server {
listen 80;
listen [::]:80;
server_name localhost;
location /melon/ {
proxy_pass http://melon:8080/;
}
location /water/ {
proxy_pass http://water:8081/;
}
}
}

View File

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
afanasev_dmitry_lab_3/water/.gitignore vendored Normal file
View File

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

View File

@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

View File

@ -0,0 +1,4 @@
FROM bellsoft/liberica-openjdk-alpine:17.0.8
ADD target/water-0.0.1-SNAPSHOT.jar /app/
CMD ["java", "-Xmx200m", "-jar", "/app/water-0.0.1-SNAPSHOT.jar"]
WORKDIR /app

259
afanasev_dmitry_lab_3/water/mvnw vendored Normal file
View File

@ -0,0 +1,259 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.2
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
if [ -n "${JAVA_HOME-}" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
trim() {
# MWRAPPER-139:
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
# Needed for removing poorly interpreted newline sequences when running in more
# exotic environments such as mingw bash on Windows.
printf "%s" "${1}" | tr -d '[:space:]'
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl=$(trim "${value-}") ;;
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"

149
afanasev_dmitry_lab_3/water/mvnw.cmd vendored Normal file
View File

@ -0,0 +1,149 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>ru.ulstu</groupId>
<artifactId>water</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>water</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,13 @@
package ru.ulstu.water;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WaterApplication {
public static void main(String[] args) {
SpringApplication.run(WaterApplication.class, args);
}
}

View File

@ -0,0 +1,58 @@
package ru.ulstu.water.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.ulstu.water.dto.WaterDto;
import ru.ulstu.water.model.Melon;
import ru.ulstu.water.model.Water;
import ru.ulstu.water.service.WaterService;
import java.util.Collection;
import java.util.UUID;
@RestController
@RequiredArgsConstructor
@RequestMapping("/water")
public class WaterController {
private final WaterService waterService;
@GetMapping
public ResponseEntity<Collection<Water>> get() {
return new ResponseEntity<>(waterService.get(), HttpStatus.OK);
}
@GetMapping("/{id}")
public ResponseEntity<Water> get(@PathVariable UUID id) {
return new ResponseEntity<>(waterService.get(id), HttpStatus.OK);
}
@PostMapping
public ResponseEntity<Water> add(@RequestBody WaterDto dto) {
return new ResponseEntity<>(waterService.add(dto), HttpStatus.OK);
}
@PutMapping("/{id}")
public ResponseEntity<Water> update(@PathVariable UUID id, @RequestBody WaterDto dto) {
return new ResponseEntity<>(waterService.update(id, dto), HttpStatus.OK);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable UUID id) {
waterService.delete(id);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/{id}/addMelon")
public ResponseEntity<Water> addMelon(@PathVariable UUID id, @RequestBody Melon melon) {
return new ResponseEntity<>(waterService.addMelon(id, melon), HttpStatus.OK);
}
}

View File

@ -0,0 +1,11 @@
package ru.ulstu.water.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public class WaterDto {
private Boolean isSweetBottom;
private Double volume;
}

View File

@ -0,0 +1,19 @@
package ru.ulstu.water.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.UUID;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Melon {
private UUID id;
private Boolean isRipe;
private Double weight;
private UUID waterMelonId;
}

View File

@ -0,0 +1,20 @@
package ru.ulstu.water.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
import java.util.UUID;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Water {
private UUID id;
private Boolean isSweetBottom;
private Double volume;
private List<Melon> waterMelons;
}

View File

@ -0,0 +1,64 @@
package ru.ulstu.water.service;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;
import ru.ulstu.water.dto.WaterDto;
import ru.ulstu.water.model.Melon;
import ru.ulstu.water.model.Water;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Service
public class WaterService {
private final Map<UUID, Water> waters = new HashMap<>();
public Collection<Water> get() {
return waters.values();
}
public Water get(UUID id) {
if (!waters.containsKey(id)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Water not found");
}
return waters.get(id);
}
public Water add(WaterDto dto) {
Water water = new Water(UUID.randomUUID(),
dto.getIsSweetBottom(),
dto.getVolume(),
new ArrayList<>());
waters.put(water.getId(), water);
return water;
}
public Water update(UUID id, WaterDto dto) {
Water water = waters.get(id);
if (dto.getIsSweetBottom() != null)
water.setIsSweetBottom(dto.getIsSweetBottom());
if (dto.getVolume() != null)
water.setVolume(dto.getVolume());
return water;
}
public void delete(UUID id) {
if (!waters.containsKey(id)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Water not found");
}
waters.remove(id);
}
public Water addMelon(UUID id, Melon melon) {
if (!waters.containsKey(id)) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Water not found");
}
final Water water = waters.get(id);
water.getWaterMelons().add(melon);
return water;
}
}

View File

@ -0,0 +1,2 @@
spring.application.name=water
server.port=8081

View File

@ -0,0 +1,13 @@
package ru.ulstu.water;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class WaterApplicationTests {
@Test
void contextLoads() {
}
}

View File

@ -0,0 +1,16 @@
# Лабораторная работа 4
## Описание
Данная лабораторная работа предназначена для изучения проектирования приложений при помощи брокера сообщений.
### Уроки из RabbitMQ Tutorials
1. ![img.png](images/img1.png)
2. ![img.png](images/img2.png)
3. ![img.png](images/img3.png)
### Задание
Ссылка на демонстрацию работы программы: https://vk.com/video215756667_456239454?list=ln-IJETwWy23zLuysjetJ
## Выводы
1. Запуск 1 и 2 Consumer'а: Consumer-2 (без задержки) график Queued Messages держится на нуле, в то время как у Consumer-1 график возрастает (скорость обработки сообщений < 1 с).
2. Запуск 2 первых Consumer'ов: обрабатывают сообщения последовательно и накапливают очередь.

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
<option name="theme" value="material" />
<option name="button1Title" value="" />
<option name="button1Url" value="" />
<option name="button2Title" value="" />
<option name="button2Url" value="" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.ulstu</groupId>
<artifactId>lesson1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.22.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,29 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
});
}
}

View File

@ -0,0 +1,24 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
}
}

View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
<option name="theme" value="material" />
<option name="button1Title" value="" />
<option name="button1Url" value="" />
<option name="button2Title" value="" />
<option name="button2Url" value="" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.ulstu</groupId>
<artifactId>lesson2</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.22.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,29 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
public class NewTask {
private static final String TASK_QUEUE_NAME = "task_queue";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
String message = String.join(" ", argv);
channel.basicPublish("", TASK_QUEUE_NAME,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}

View File

@ -0,0 +1,48 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class Worker {
private static final String TASK_QUEUE_NAME = "task_queue";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
int prefetchCount = 1;
channel.basicQos(prefetchCount);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
try {
doWork(message);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
System.out.println(" [x] Done");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
};
boolean autoAck = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAck, deliverCallback, consumerTag -> {
});
}
private static void doWork(String task) throws InterruptedException {
for (char ch : task.toCharArray()) {
if (ch == '.') Thread.sleep(1000);
}
}
}

View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
<option name="theme" value="material" />
<option name="button1Title" value="" />
<option name="button1Url" value="" />
<option name="button2Title" value="" />
<option name="button2Url" value="" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.ulstu</groupId>
<artifactId>lesson3</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.22.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,25 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class EmitLog {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
String message = argv.length < 1 ? "info: Hello World!" : String.join(" ", argv);
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}

View File

@ -0,0 +1,33 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class ReceiveLogs {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
});
}
}

38
afanasev_dmitry_lab_4/task/.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
<option name="theme" value="material" />
<option name="button1Title" value="" />
<option name="button1Url" value="" />
<option name="button2Title" value="" />
<option name="button2Url" value="" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.ulstu</groupId>
<artifactId>task</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.22.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,38 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class OrderConsumer1 {
private static final String EXCHANGE_NAME = "orders";
private static final String QUEUE_NAME = "consumer1_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
System.out.println(" [*] Consumer 1 ожидает сообщений.");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
System.out.println(" [x] Consumer 1 получил сообщение, обработает через 3 с.: " + message);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {
});
}
}

View File

@ -0,0 +1,34 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class OrderConsumer2 {
private static final String EXCHANGE_NAME = "orders";
private static final String QUEUE_NAME = "consumer2_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// Создаём exchange и очередь
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
System.out.println(" [*] Consumer 2 ожидает сообщений.");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
System.out.println(" [x] Consumer 2 моментально обработал сообщение: " + message);
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {
});
}
}

View File

@ -0,0 +1,26 @@
package ru.ulstu;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class OrderPublisher {
private static final String EXCHANGE_NAME = "orders";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
while (true) {
String message = "Новый заказ #" + System.currentTimeMillis();
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println(" [x] Отправлено сообщение: " + message);
Thread.sleep(1000);
}
}
}
}

View File

@ -0,0 +1,31 @@
# Лабораторная работа 5
## Описание
Задание заключается в реализации алгоритмов умножения больших квадратных матриц. Необходимо разработать два алгоритма: последовательный и параллельный. А также провести бенчмарки, а затем описать результаты в отчете.
**100x100 матрица**:
- **4 потока** — наилучший результат.
- **10 потоков** — медленнее на почти в половину.
- **6 и 8 потоков** — хуже 4 потоков.
- **1 и 2 потока** — значительно медленнее.
**300x300 матрица**:
- **4 потока** — лучший результат.
- **8 потоков** — чуть хуже.
- **10 потоков** — медленнее.
- **1 и 2 потока** — значительно медленнее.
**500x500 матрица**:
- **8 потоков** — лучший результат.
- **6 и 10 потоков** — немного хуже.
- **4 потока** — значительно медленнее.
- **1 поток** — самый медленный.
**Ссылка на демонстрацию работы программы**: https://vk.com/video215756667_456239455?list=ln-z7zFcpvxLexJd3f8ss
**Вывод**:
- Если операция сложнее, рост производительности происходит с увеличением числа потоков.
- Слишком много потоков увеличивает накладные расходы (например, 10 потоков). Это может быть связано, например, с:
1. **Переключением контекстов**: Когда потоков больше, чем ядер процессора, операционная система часто переключает контексты, что занимает время.
2. **Конкуренцией за ресурсы**: Много потоков конкурируют за ограниченные ресурсы, такие как процессорное время и кэш.
3. **Управлением потоками**: С увеличением числа потоков растёт нагрузка на систему, связанную с их созданием, управлением и завершением.

29
afanasev_dmitry_lab_5/main/.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,120 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MatrixMultiplier {
private final int[][] matrixA;
private final int[][] matrixB;
private final int[][] result;
private final int size;
public MatrixMultiplier(int size) {
this.size = size;
this.matrixA = generateMatrix(size);
this.matrixB = generateMatrix(size);
this.result = new int[size][size];
}
private int[][] generateMatrix(int size) {
int[][] matrix = new int[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
matrix[i][j] = (int) (Math.random() * 10);
}
}
return matrix;
}
public void multiplySequential() {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
for (int k = 0; k < size; k++) {
result[i][j] += matrixA[i][k] * matrixB[k][j];
}
}
}
}
public void multiplyParallel(int numThreads) throws InterruptedException {
if (numThreads == 1) {
multiplySequential();
return;
}
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
int chunkSize = (int) Math.ceil((double) size / numThreads);
for (int thread = 0; thread < numThreads; thread++) {
final int startRow = thread * chunkSize;
final int endRow = Math.min(startRow + chunkSize, size);
executor.submit(() -> {
for (int i = startRow; i < endRow; i++) {
for (int j = 0; j < size; j++) {
for (int k = 0; k < size; k++) {
result[i][j] += matrixA[i][k] * matrixB[k][j];
}
}
}
});
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
}
private void resetResult() {
for (int i = 0; i < size; i++) {
Arrays.fill(result[i], 0);
}
}
static class Result {
int threads;
long time;
Result(int threads, long time) {
this.threads = threads;
this.time = time;
}
}
public static void main(String[] args) throws InterruptedException {
int[] matrixSizes = {100, 300, 500};
int[] threadCounts = {1, 2, 4, 6, 8, 10};
int runs = 5; // количество прогонов
for (int size : matrixSizes) {
System.out.println("\nРазмер матрицы: " + size + "x" + size);
MatrixMultiplier multiplier = new MatrixMultiplier(size);
List<Result> results = new ArrayList<>();
for (int threads : threadCounts) {
long totalDuration = 0;
for (int run = 0; run < runs; run++) {
multiplier.resetResult();
long startTime = System.nanoTime();
multiplier.multiplyParallel(threads);
long endTime = System.nanoTime();
totalDuration += (endTime - startTime);
}
long averageDuration = totalDuration / runs;
results.add(new Result(threads, averageDuration));
}
// Сортировка по времени выполнения
results.sort(Comparator.comparingLong(r -> r.time));
System.out.println("Результаты (среднее время за " + runs + " прогонов):");
for (Result result : results) {
System.out.printf("Потоки: %d, среднее время: %d нс\n", result.threads, result.time);
}
}
}
}

View File

@ -0,0 +1,118 @@
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FastDeterminantCalculator {
public static void main(String[] args) {
int[] sizes = {100, 300, 500};
int[] threads = {1, 4, 8, 10};
for (int size : sizes) {
BigDecimal[][] matrix = generateMatrix(size);
for (int threadCount : threads) {
long start = System.currentTimeMillis();
BigDecimal determinant = calculateDeterminant(matrix, threadCount);
long end = System.currentTimeMillis();
System.out.printf("Matrix size: %dx%d, Threads: %d, Time: %d ms\n",
size, size, threadCount, (end - start));
}
}
}
public static BigDecimal[][] generateMatrix(int size) {
BigDecimal[][] matrix = new BigDecimal[size][size];
for (int i = 0; i < size; i++) {
BigDecimal rowSum = BigDecimal.ZERO;
for (int j = 0; j < size; j++) {
matrix[i][j] = BigDecimal.valueOf(Math.random() * 10);
if (i != j) {
rowSum = rowSum.add(matrix[i][j]);
}
}
matrix[i][i] = rowSum.add(BigDecimal.valueOf(Math.random() * 10 + 1));
}
return matrix;
}
public static BigDecimal calculateDeterminant(BigDecimal[][] matrix, int threadCount) {
int size = matrix.length;
BigDecimal[][] lu = new BigDecimal[size][size];
int[] permutations = new int[size];
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
if (!luDecomposition(matrix, lu, permutations, executor)) {
executor.shutdown();
return BigDecimal.ZERO; // Матрица вырожденная
}
executor.shutdown();
BigDecimal determinant = BigDecimal.ONE;
for (int i = 0; i < size; i++) {
determinant = determinant.multiply(lu[i][i]);
if (permutations[i] != i) {
determinant = determinant.negate(); // Меняем знак при перестановке
}
}
return determinant;
}
public static boolean luDecomposition(BigDecimal[][] matrix, BigDecimal[][] lu, int[] permutations, ExecutorService executor) {
int size = matrix.length;
for (int i = 0; i < size; i++) {
System.arraycopy(matrix[i], 0, lu[i], 0, size);
permutations[i] = i;
}
for (int k = 0; k < size; k++) {
int pivot = k;
for (int i = k + 1; i < size; i++) {
if (lu[i][k].abs().compareTo(lu[pivot][k].abs()) > 0) {
pivot = i;
}
}
if (lu[pivot][k].abs().compareTo(BigDecimal.valueOf(1e-10)) < 0) {
return false;
}
if (pivot != k) {
BigDecimal[] temp = lu[k];
lu[k] = lu[pivot];
lu[pivot] = temp;
int tempPerm = permutations[k];
permutations[k] = permutations[pivot];
permutations[pivot] = tempPerm;
}
CountDownLatch latch = new CountDownLatch(size - k - 1);
for (int i = k + 1; i < size; i++) {
int row = i;
int finalK = k;
executor.submit(() -> {
MathContext mc = new MathContext(20, RoundingMode.HALF_UP);
lu[row][finalK] = lu[row][finalK].divide(lu[finalK][finalK], mc);
for (int j = finalK + 1; j < size; j++) {
lu[row][j] = lu[row][j].subtract(lu[row][finalK].multiply(lu[finalK][j], mc));
}
latch.countDown();
});
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}
return true;
}
}

View File

@ -0,0 +1,31 @@
# Лабораторная работа 6
## Описание
Задание заключается в реализации алгоритмов нахождения детерминанта квадратной матрицы. Необходимо разработать два алгоритма: последовательный и параллельный. А также провести бенчмарки, а затем описать результаты в отчете.
**100x100 матрица**:
- **8 потоков** — наилучший результат.
- **10 потоков** — результат немного хуже.
- **4 потока** — примерно такой же результат как на 10 потоках.
- **1 поток** — наихудший результат.
**300x300 матрица**:
- **10 потока** — лучший результат.
- **8 потоков** — чуть хуже.
- **4 потока** — ещё медленее.
- **1 поток** — наихудший результат.
**500x500 матрица**:
- **10 потока** — лучший результат.
- **8 потоков** — чуть хуже.
- **4 потока** — ещё медленее.
- **1 поток** — наихудший результат.
**Ссылка на демонстрацию работы программы**: https://vkvideo.ru/video215756667_456239456?list=ln-W6TTsYuIRdX8ft7ADr
**Вывод**:
- Если операция сложнее, рост производительности происходит с увеличением числа потоков.
- Слишком много потоков увеличивает накладные расходы (замтено только на неочень сложных операциях). Это может быть связано, например, с:
1. **Переключением контекстов**: Когда потоков больше, чем ядер процессора, операционная система часто переключает контексты, что занимает время.
2. **Конкуренцией за ресурсы**: Много потоков конкурируют за ограниченные ресурсы, такие как процессорное время и кэш.
3. **Управлением потоками**: С увеличением числа потоков растёт нагрузка на систему, связанную с их созданием, управлением и завершением.

View File

@ -0,0 +1,13 @@
Балансировка нагрузки — это способ распределения запросов между серверами для предотвращения их перегрузки и обеспечения быстродействия системы.
Для этого используются алгоритмы, такие как Round Robin, Least Connections, IP Hash.
Среди популярных открытых технологий — Nginx, HAProxy и Traefik. Nginx часто работает как реверс-прокси,
распределяя запросы и обрабатывая SSL. HAProxy подходит для высоконагруженных систем, а Traefik автоматически
настраивает маршрутизацию в облачных кластерах.
В базах данных балансировка нагрузки позволяет направлять запросы на чтение к репликам, а на запись — к основному узлу.
Инструменты, такие как ProxySQL, помогают автоматизировать этот процесс.
Реверс-прокси не только распределяет нагрузку, но и повышает безопасность системы, скрывая её внутреннюю архитектуру.
Таким образом, открытые технологии играют ключевую роль в создании масштабируемых и надёжных систем.

View File

@ -0,0 +1,15 @@
Распределённые системы являются основой современных сервисов, включая социальные сети. Их устройство предполагает разделение задач на микросервисы,
где каждый компонент выполняет узкоспециализированную функцию. Это упрощает разработку, позволяет масштабировать только необходимые части системы и
делает её более устойчивой к сбоям.
Для управления такими системами используются инструменты оркестрации, например, Kubernetes и Docker Swarm. Они автоматизируют развёртывание,
масштабирование и обновление сервисов, упрощая сопровождение. Однако их использование требует опыта и может осложнить отладку.
Очереди сообщений, такие как RabbitMQ или Kafka, помогают асинхронно передавать данные между сервисами. Это снижает нагрузку и обеспечивает надёжное взаимодействие,
передавая запросы, уведомления или данные для обработки.
Распределённые системы обладают преимуществами в виде масштабируемости, устойчивости и гибкости разработки.
Однако их сложность может стать серьёзным вызовом при проектировании и сопровождении.
Параллельные вычисления полезны, например, для обработки больших объёмов данных или машинного обучения,
но в некоторых случаях последовательная обработка более предпочтительна. Такой подход требует анализа задач, чтобы избежать излишней сложности.

View File

@ -0,0 +1,69 @@
services:
wp_db:
image: mariadb:10.6.4-focal
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- wp_db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- 52384:80
restart: always
environment:
- WORDPRESS_DB_HOST=wp_db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
db:
image: postgres:latest
container_name: db
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: postgres
volumes:
- db_data:/var/lib/postgresql
redmine:
image: redmine:latest
container_name: redmine
ports:
- "11001:3000"
environment:
- REDMINE_DB_POSTGRESQL=db
- REDMINE_DB_DATABASE=redmine
- REDMINE_DB_USERNAME=posgres
- REDMINE_DB_PASSWORD=1234
depends_on:
- db
gitea:
image: gitea/gitea:latest
container_name: gitea
ports:
- "11002:3000"
environment:
- USER_UID=1000
- USER_GID=1000
volumes:
- gitea_data:/data
volumes:
wp_db_data:
wp_data:
db_data:
redmine_db_data:
gitea_data:

View File

@ -0,0 +1,126 @@
▎Лабораторная работа №1 - Знакомство с Docker и Docker Compose
Цель: Изучение современных технологий контейнеризации.
▎Задачи:
1. Установить Docker.
2. Изучить применение и принципы работы Docker.
3. Изучить утилиту Docker Compose и структуру файла docker-compose.yml.
4. Развернуть не менее трех различных сервисов с помощью Docker Compose.
▎Разворачивание сервисов
Необходимо развернуть минимум три сервиса из предложенного списка:
1. Redmine - система учета багов (баг-трекер).
2. WordPress - популярная система управления контентом.
3. Gitea - сервис для хранения git-репозиториев.
▎Требования к Docker Compose:
• Несколько контейнеров.
• Хотя бы один volume.
• Хотя бы один проброшенный порт на хост.
Система должна быть развернута полностью, включая создание администратора и корректное функционирование, что будет подтверждено скриншотами.
▎Ход работы
1. Установил Docker Desktop на Windows.
2. Проверил установку с помощью команды docker --version.
3. Развернул сервисы (описаны ниже).
▎Объяснение работы кода:
▎WordPress:
1. Образ сборки:
image: wordpress:latest - используется последний официальный образ WordPress.
2. Имя контейнера:
container_name: wordpress - имя контейнера устанавливается как wordpress.
3. Проброс портов:
Порт 80 контейнера пробрасывается на порт 8080 хоста.
4. Тома для хранения данных:
volumes:
- wordpress_data:/var/www/html
Том wordpress_data монтируется в директорию /var/www/html контейнера для хранения данных WordPress.
5. Переменные окружения для WordPress:
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: example_user
WORDPRESS_DB_PASSWORD: example_password
WORDPRESS_DB_NAME: example_db
Параметры для подключения к базе данных.
6. Зависимость от базы данных:
depends_on: db - указывает, что WordPress зависит от контейнера базы данных (db).
▎Redmine:
1. Образ сборки:
image: redmine:latest - используется последний официальный образ Redmine.
2. Имя контейнера:
container_name: redmine - имя контейнера устанавливается как redmine.
3. Проброс портов:
ports:"8081:3000" - порт 3000 контейнера пробрасывается на порт 8081 хоста.
4. Переменные окружения для Redmine:
environment:
REDMINE_DB_MYSQL: redmine_db
REDMINE_DB_USERNAME: redmine_user
REDMINE_DB_PASSWORD: redmine_password
Параметры для подключения к базе данных.
5. Зависимость от базы данных:
depends_on: - redmine_db - Redmine зависит от контейнера с базой данных.
▎Gitea:
1. Образ сборки:
image: gitea/gitea:latest - используется последний официальный образ Gitea.
2. Имя контейнера:
container_name: gitea - имя контейнера устанавливается как gitea.
3. Проброс портов:
ports:"8082:3000" - порт 3000 контейнера пробрасывается на порт 8082 хоста.
4. Тома для хранения данных:
volumes:
- gitea_data:/data
[Видео](https://disk.yandex.ru/d/JFWkukJKwbfhIw)

View File

@ -0,0 +1,30 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**

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