{"id":380243,"date":"2024-06-28T21:00:12","date_gmt":"2024-06-28T21:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=380243"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=380243","title":{"rendered":"<span>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 IoT-\u043c\u043e\u0434\u0443\u043b\u044f: Python, make, \u0430\u043f\u0435\u043b\u044c\u0441\u0438\u043d\u044b \u0438 \u0447\u0451\u0440\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u0435\u0440\u0434\u0446\u0435 \u0438 \u043c\u043e\u0437\u0433 \u043b\u044e\u0431\u043e\u0433\u043e \u0448\u0435\u0440\u0438\u043d\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u0430 \u2014 IoT-\u043c\u043e\u0434\u0443\u043b\u044c: \u043e\u043d <em>\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442<\/em>, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u043a\u0440\u0443\u0433, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <em>\u043c\u044b\u0448\u0446\u0430\u043c\u0438, \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f<\/em> \u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c. \u0412\u0441\u0451, \u0447\u0442\u043e \u043e\u043d \u0437\u043d\u0430\u0435\u0442 \u043e \u043c\u0438\u0440\u0435, \u0438 \u0442\u043e, \u043a\u0430\u043a \u0441\u0435\u0431\u044f \u0432\u0435\u0434\u0451\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439. \u0412 \u043d\u0430\u0448\u0438\u0445 \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u0430\u0445 \u0441\u0442\u043e\u0438\u0442 IoT-\u043c\u043e\u0434\u0443\u043b\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0441\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u043c\u043d\u044e, \u0431\u044b\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u043e\u0442\u0434\u0435\u043b \u0441\u043e\u0441\u0442\u043e\u044f\u043b \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041c\u044b \u0441\u0438\u0434\u0435\u043b\u0438 \u043d\u0430 Windows. \u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0430\u0441\u044c \u0432 eclipse-based Atollic True Studio \u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 (\u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, STM32CubeIDE \u043c\u0438\u043d\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u0441). \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 <a href=\"https:\/\/www.gnu.org\/software\/make\/manual\/make.html\">make<\/a>\u2019file, \u0438 \u0434\u043e \u043f\u043e\u0440\u044b \u0434\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0441 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u043e.<\/p>\n<p>\u0428\u043b\u043e \u0432\u0440\u0435\u043c\u044f, Whoosh \u0440\u043e\u0441 \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u0435\u0449\u0451 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442. \u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043e\u0441\u0435\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c Linux \u0438 macOS, \u0430 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0438 \u0447\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043b\u0441\u044f \u0438 \u0441\u0440\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0430 \u043d\u0435\u2026<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fb1\/a92\/96f\/fb1a9296ff20bed246b40d96d489986e.gif\" alt=\" \u0422\u0443\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0443\u043f\u0430\u043b\u043e.\" title=\" \u0422\u0443\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0443\u043f\u0430\u043b\u043e.\" width=\"498\" height=\"342\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fb1\/a92\/96f\/fb1a9296ff20bed246b40d96d489986e.gif\"\/><\/p>\n<div><figcaption> \u0422\u0443\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0443\u043f\u0430\u043b\u043e.<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0443\u0436\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c <a href=\"https:\/\/developer.arm.com\/Tools%20and%20Software\/GNU%20Toolchain\">\u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0430<\/a>) \u0438 make. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043e\u0434\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u043d\u043e \u0441 make\u2019\u043e\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u0441\u0430\u043c\u043e\u0438\u0441\u0442\u044f\u0437\u0430\u043d\u0438\u0435\u043c. \u041d\u0443\u0436\u0435\u043d \u0441\u0430\u043c \u043a\u043e\u0434, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0430 \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u2014 \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <a href=\"https:\/\/code.visualstudio.com\/\">VS Code<\/a> \u2014 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u043c\u0438, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043d\u0438\u0445 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/eclipseide.org\/\">Eclipse<\/a> \u2014 \u0443 \u043d\u0435\u0433\u043e \u0440\u044f\u0434 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0418\u043b\u0438 \u0434\u0430\u0436\u0435 <a href=\"https:\/\/www.vim.org\/\">Vim<\/a>, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e \u0434\u0443\u0448\u0435 \u0445\u0430\u0440\u0434\u043a\u043e\u0440. \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 IDE \u043c\u044b \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438, \u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438: shell, make \u0438 Python.<\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 make<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0441\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435. \u0412 IoT-\u043c\u043e\u0434\u0443\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044f\u0437\u044b\u043a C\u0438. \u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u0435\u0451 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. \u0410 make \u2014 \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0410 \u0442\u0430\u043a\u0436\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043b\u043e\u0432, \u0442\u043e make \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 <em>\u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c<\/em> \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b.<\/p>\n<\/div>\n<\/details>\n<h4>Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0438\u0440\u0438\u0436\u0438\u0440\u0443\u0435\u0442<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d \u044f\u0434\u0440\u043e\u043c \u0432\u0441\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u044b\u043b make, \u0442\u043e \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb0\/a95\/1ca\/eb0a951ca40edffa403bb82ad429314b.png\" width=\"1642\" height=\"562\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eb0\/a95\/1ca\/eb0a951ca40edffa403bb82ad429314b.png\"\/><\/figure>\n<p>\u041a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0442\u0430\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u0430 \u0438 \u0441\u0430\u043c make \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e shell-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 python-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u0435\u0440\u0451\u043c Python \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0435\u0433\u043e \u0437\u043d\u0430\u044e\u0442, \u043d\u0430 \u043d\u0451\u043c \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u2026 \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0451 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u0443 \u042d\u043a\u0437\u044e\u043f\u0435\u0440\u0438: <s>\u0443\u0434\u0430\u0432<\/s> \u043f\u0438\u0442\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0433\u043b\u043e\u0442\u0438\u043b <s>\u0441\u043b\u043e\u043d\u0430<\/s> \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438.<\/p>\n<p>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a: \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Python \u043f\u0430\u0440\u0441\u0438\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 make \u0438 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0438 \u0441\u0430\u043c \u0436\u0435 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043d\u0435 \u0438\u0441\u0442\u0438\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438, \u043d\u043e \u0443 \u043d\u0430\u0441 \u043e\u043d\u043e \u043f\u0440\u0438\u0436\u0438\u043b\u043e\u0441\u044c (\u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/96d\/d53\/499\/96dd534991cc1052a6ad79a60fddc7db.jpg\" alt=\" \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0434\u0430\u0432 \u0441\u044a\u0435\u043b \u0430\u043d\u0442\u0438\u043b\u043e\u043f\u0443 \u0433\u043d\u0443.\" title=\" \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0434\u0430\u0432 \u0441\u044a\u0435\u043b \u0430\u043d\u0442\u0438\u043b\u043e\u043f\u0443 \u0433\u043d\u0443.\" width=\"1160\" height=\"828\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/96d\/d53\/499\/96dd534991cc1052a6ad79a60fddc7db.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption> \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0434\u0430\u0432 \u0441\u044a\u0435\u043b \u0430\u043d\u0442\u0438\u043b\u043e\u043f\u0443 \u0433\u043d\u0443.<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u0430\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c Python \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0434\u0430\u0431\u044b \u043d\u0435 \u043c\u0443\u0441\u043e\u0440\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c requirements. \u0412\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u041e\u0421 <em>venv<\/em> \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u0438\u0442\u043e\u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c shell-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0432\u0430\u0435\u0442 <em>venv<\/em> \u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c.<\/p>\n<pre><code class=\"bash\">#!\/usr\/bin\/env bash  if [ \"$OS_NAME\" == \"Darwin\" ]; then     VENV_NAME=virtualenv     VENV_SRC=bin     PYTHON_NAME=python3 elif [ \"$OS_NAME\" == \"Linux\" ]; then     VENV_NAME=venv     VENV_SRC=bin     PYTHON_NAME=python3 elif [ \"$OS_NAME\" == \"Windows_NT\" ]; then     VENV_NAME=venv     VENV_SRC=Scripts     PYTHON_NAME=python fi  if [ -d \".venv\" ]; then     echo .venv exists else     echo there is no .venv     $PYTHON_NAME -m $VENV_NAME .venv     .venv\/$VENV_SRC\/$PYTHON_NAME -m pip install --upgrade pip     .venv\/$VENV_SRC\/pip install -r requirements.txt fi   python_build_script=builds\/fw_builder.py echo Python cmd: .venv\/$VENV_SRC\/$PYTHON_NAME $python_build_script $* .venv\/$VENV_SRC\/$PYTHON_NAME $python_build_script $* <\/code><\/pre>\n<h4>\u0413\u0440\u0430\u0431\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0436\u0438\u0434\u0430\u044e\u0442<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0432\u0430\u0441, \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0432\u0434\u0440\u0443\u0433 \u0440\u0435\u0448\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u0442\u043e \u044f \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043f\u0440\u043e \u0442\u0435 \u0433\u0440\u0430\u0431\u043b\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b \u0441\u0430\u043c.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0437\u0430\u043f\u0443\u0441\u043a \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 make \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 Python \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u0443\u0436 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c. \u0410 \u0435\u0449\u0451 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c <em>\u043d\u0430 \u043b\u0435\u0442\u0443<\/em> \u043b\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 stdout \u0438 stderr. \u041d\u0430 \u043d\u0430\u0448\u0435 \u0441\u0447\u0430\u0441\u0442\u044c\u0435, \u0432 python \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/docs.python.org\/3\/library\/subprocess.html\">subprocess<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441 Windows \u043d\u0435 \u0437\u0430\u0441\u043a\u0443\u0447\u0430\u0435\u0448\u044c. \u0412 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442, \u0445\u043e\u0442\u044f \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Windows, \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0430\u0442\u044c. \u0412\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/68658520\/how-to-bypass-pipe-buffer-size-in-python-windows\">PIPE<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u0444\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443, \u0438 \u043e\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u041e\u0421. \u041d\u0430 Windows \u2014 4096 \u0411\u0430\u0439\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043f\u044b\u0442\u0430\u0435\u0448\u044c\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430 \u0432\u0438\u043d\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u043e\u0432, stderr \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 deadlock. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u0430 stderr \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0432\u043c\u0435\u0441\u0442\u043e PIPE.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 Python \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f make-\u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0427\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u044f \u0432\u044b\u043f\u0438\u043b\u0438\u043b, \u043d\u043e \u0441\u0443\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Ctrl+C\/Ctrl+V.<\/p>\n<pre><code class=\"python\">import glob from time import time from tqdm import tqdm from subprocess import PIPE, Popen   reg_ex = r'some_pattern'  def run_cmd(cmd, N=None):     log.info(f'make cmd: {cmd}')     t0 = time()     info_str = '\\n'     bar_fmt = '{l_bar}{bar:20}{r_bar}{bar:-10b}' if N is not None else None     with open('make_err.log', 'w', encoding=\"utf-8\") as err_f:         p = Popen(cmd, shell=True, stdout=PIPE, stderr=err_f)         with tqdm(total=N, bar_format=bar_fmt) as pbar:             with open('make_build.log', 'a', encoding=\"utf-8\") as f:                 while p.poll() is None:                     output = p.stdout.readline()  # type: ignore                     if output:                         output_str = output.decode().rstrip()                         if re.match(reg_ex, output_str):                             f.write(output_str + '\\n')                             pbar.set_postfix_str(output_str)                             pbar.update()                         else:                             info_str += output_str + '\\n'      with open('make_err.log', 'r', encoding=\"utf-8\") as err_f:         std_err = err_f.readlines()      if len(std_err) > MAX_ERR_LINES:         stderr_message = 'Output is too long, please check make_err.log'     elif len(std_err) == 0:         stderr_message = ''     else:         stderr_message = ''.join(std_err)      if stderr_message != '':         if p.returncode != 0:             log.error(stderr_message)         else:             log.warning(stderr_message)      dur = time() - t0     if info_str != '\\n':         log.info(info_str)     log.info(f'execution duration {dur:.1f} sec')      for file in glob.glob(r'debug\/*.bin'):         log.info(f'binary file {file}')      return p.returncode   <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 run_cmd<\/summary>\n<div class=\"spoiler__content\">\n<p><code>reg_ex<\/code> \u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<code>N<\/code> \u043d\u0443\u0436\u043d\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430, \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u2014 \u043c\u0435\u043b\u043e\u0447\u044c, \u0430 \u043f\u0440\u0438\u044f\u0442\u043d\u043e. \u0415\u0441\u043b\u0438<code>N<\/code>\u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0442\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a. \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/clang.llvm.org\/docs\/JSONCompilationDatabase.html\">compilation database<\/a> (compile_commands.json), \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/pypi.org\/project\/compiledb\/\">\u0442\u0430\u043a\u043e\u0439<\/a>. \u0410 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e json\u2019\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>Popen<\/code>  \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>make<\/code> \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 poll\u2019\u0438\u043c \u0435\u0451, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f, \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u044b\u0434\u0430\u0451\u0442 \u0432 <code>stdout<\/code> (\u0442\u0443\u0442 \u043d\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437-\u0442\u0430\u043a\u0438 \u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>reg_ex<\/code>), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u0438 \u0437\u0430\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0410 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 <code>stderr<\/code> , \u043f\u0438\u0448\u0435\u043c \u0432 \u0444\u0430\u0439\u043b (\u0441\u043d\u043e\u0432\u0430 \u0441\u043f\u0430\u0441\u0438\u0431\u043e Windows). \u041f\u0440\u0438\u043d\u0442\u0443\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u043f\u0440\u043e VSCode. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u2014\u00a0 <a href=\"https:\/\/code.visualstudio.com\/docs\/editor\/tasks\">\u0442\u0430\u0441\u043a\u0438<\/a>. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<pre><code class=\"json\">{     \"version\": \"2.0.0\",     \"windows\": {         \"options\": {             \"shell\": {                 \"executable\": \"cmd.exe\",                 \"args\": [                     \"\/C\", \"sh\"                 ]             }         }     },     \"problemMatcher\": \"$gcc\",      \"tasks\": [         {             \"label\": \"\u274c Clean\",             \"type\": \"shell\",             \"command\": \".\/builder.sh\",             \"args\": [\"clean\"],             \"group\": {                 \"kind\": \"build\",                 \"isDefault\": true             }         },         {             \"label\": \"\u26cf\ufe0f? | Build: app-prd\",             \"type\": \"shell\",             \"command\": \".\/builder.sh\",             \"args\": [\"build\", \"app_prd\"],             \"group\": {                 \"kind\": \"build\",                 \"isDefault\": true             }         }     ] } <\/code><\/pre>\n<p>\u0412\u044b\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e json&#8217;\u0430 (<code>.vscode\/tasks.json<\/code>), \u043f\u043e \u043d\u0435\u043c\u0443 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 <code>make<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 <code>builder.sh<\/code>. \u0410 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0441\u043a\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>run_cmd<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u0422\u0430\u043a, \u043d\u0430\u0436\u0438\u043c\u0430\u044f Ctrl+Shift+B, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u043c\u0435\u043d\u044e, \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435. \u041a\u043b\u0438\u043a \u2014 \u0438 \u043f\u043e\u0431\u0435\u0436\u0430\u043b\u0430 \u0441\u0431\u043e\u0440\u043a\u0430. \u0414\u0430\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0431\u0438\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043d\u0430 \u0434\u0435\u043b\u0435 \u0438\u0445 \u0443 \u043d\u0430\u0441 \u043e\u043a\u043e\u043b\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441 \u0442\u0430\u0441\u043a\u0430\u043c\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0441\u0442\u0430\u0442\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3df\/dc1\/551\/3dfdc1551ad09fba0893f6c33577702b.png\" width=\"1117\" height=\"277\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3df\/dc1\/551\/3dfdc1551ad09fba0893f6c33577702b.png\"\/><\/figure>\n<p>\u0422\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u0434\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e make \u043d\u0430 \u0441\u0432\u044f\u0437\u043a\u0443 python-make \u0438 \u043f\u043e\u0441\u043b\u0435. \u041e\u0431\u0435 \u0433\u0438\u0444\u043a\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u044b \u0432 10 \u0440\u0430\u0437, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043d\u0430 \u0434\u0435\u043b\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/700\/6f8\/3b4\/7006f83b402b31406fa50638346b85e7.gif\" alt=\" \u201c\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u0438\u0437 \u041c\u0430\u0442\u0440\u0438\u0446\u044b, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0442\u044b \u043c\u043e\u0436\u0435\u0448\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0435\u0448\u044c \u043a \u044d\u0442\u043e\u043c\u0443. \u042f \u0443\u0436\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0438\u0436\u0443 \u043a\u043e\u0434. \u042f \u0432\u0438\u0436\u0443 \u0431\u043b\u043e\u043d\u0434\u0438\u043d\u043a\u0443, \u0431\u0440\u044e\u043d\u0435\u0442\u043a\u0443, \u0440\u044b\u0436\u0443\u044e.\u201d\" title=\" \u201c\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u0438\u0437 \u041c\u0430\u0442\u0440\u0438\u0446\u044b, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0442\u044b \u043c\u043e\u0436\u0435\u0448\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0435\u0448\u044c \u043a \u044d\u0442\u043e\u043c\u0443. \u042f \u0443\u0436\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0438\u0436\u0443 \u043a\u043e\u0434. \u042f \u0432\u0438\u0436\u0443 \u0431\u043b\u043e\u043d\u0434\u0438\u043d\u043a\u0443, \u0431\u0440\u044e\u043d\u0435\u0442\u043a\u0443, \u0440\u044b\u0436\u0443\u044e.\u201d\" width=\"720\" height=\"203\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/700\/6f8\/3b4\/7006f83b402b31406fa50638346b85e7.gif\"\/><\/p>\n<div><figcaption> \u201c<em>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u0438\u0437 \u041c\u0430\u0442\u0440\u0438\u0446\u044b, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0442\u044b \u043c\u043e\u0436\u0435\u0448\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0435\u0448\u044c \u043a \u044d\u0442\u043e\u043c\u0443. \u042f \u0443\u0436\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0438\u0436\u0443 \u043a\u043e\u0434. \u042f \u0432\u0438\u0436\u0443 \u0431\u043b\u043e\u043d\u0434\u0438\u043d\u043a\u0443, \u0431\u0440\u044e\u043d\u0435\u0442\u043a\u0443, \u0440\u044b\u0436\u0443\u044e.<\/em>\u201d<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c16\/239\/bac\/c16239bac321cd86b7b784dc2f833c4f.gif\" alt=\" \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u043f\u0440\u044f\u043c\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442.\" title=\" \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u043f\u0440\u044f\u043c\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442.\" width=\"720\" height=\"203\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c16\/239\/bac\/c16239bac321cd86b7b784dc2f833c4f.gif\"\/><\/p>\n<div><figcaption> \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u043d\u043e, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u043f\u0440\u044f\u043c\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442.<\/figcaption><\/div>\n<\/figure>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <em>venv<\/em> \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u043f\u043b\u044e\u0448\u043a\u0430\u043c\u0438. \u041d\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u0441\u0430\u043c\u043e\u0433\u043e Python. \u0410 \u0442\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0438\u0441\u043a \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0439 \u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0414\u0430 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043a\u0430\u043a-\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u043d\u0435 \u0432 \u043f\u0430\u043a\u0435\u0442 \u0436\u0435 \u0438 \u043d\u0435 \u0432 \u0441\u0443\u043c\u043a\u0443. \u0422\u043e\u0447\u043d\u043e, \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440! \u0427\u0442\u043e \u0436\u0435, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0439\u0442\u0438 \u0432 docker.<\/p>\n<h4>Docker, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0441\u043c\u043e\u0433<\/h4>\n<p>\u0417\u0430 \u0431\u0430\u0437\u0443 \u0432\u043e\u0437\u044c\u043c\u0451\u043c Ubuntu, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 Python, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u2014 \u0438 \u0432\u043e\u0442 \u043e\u043d \u043d\u0430\u0448 \u043e\u0431\u0440\u0430\u0437. \u0412\u0440\u043e\u0434\u0435 \u0432\u0441\u0451, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u2026 \u0418\u043b\u0438 \u043d\u0435 \u0432\u0441\u0451? \u0410 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c-\u0442\u043e \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c? \u0417\u043d\u0430\u0447\u0438\u0442, \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c (\u0432 \u043d\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438) \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0451 docker volume. \u041d\u0443 \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c bind mount \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0432 docker \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435:<\/p>\n<ul>\n<li>\n<p>Bind mounts \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u043f\u043a\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u043d\u043e <em>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/em> \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u043e\u043a\u0435\u0440\u0430. \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 anonymous volume \u0438 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0434\u043e\u0431\u0435\u043d \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043c\u044b\u0441\u043b\u0430\u0445, <strong>\u043a\u0440\u043e\u043c\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438<\/strong> (\u043d\u0430 Windows \u0438 Mac \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0440\u0430\u0437\u044b \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u043d\u0430 Linux \u2014 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u043a\u0430\u043a \u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 volumes).<\/p>\n<\/li>\n<li>\n<p>Volumes \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 volume \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0445\u043e\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>docker cp<\/code>. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0431\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u043b\u0438\u0431\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u0445\u043e\u0441\u0442\u043e\u043c \u0438 volume\u2019\u043e\u043c. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0435\u043a\u0442, \u0433\u0434\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e <a href=\"http:\/\/docker-sync.io\/\">http:\/\/docker-sync.io\/<\/a>, \u043d\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0438\u0433\u0440\u0430 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u0432\u0435\u0447.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a?<\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438. \u041d\u0430 Windows \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f docker \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0438\u043d\u0443\u0442\u0443 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c. \u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043d\u0430 Linux \u0438 \u043d\u0430 macOS \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u2026 \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434, \u041a\u0430\u0440\u043b!<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430 Windows \u0438 \u0443\u0436\u0435 \u0441\u043c\u0438\u0440\u0438\u043b\u0438\u0441\u044c \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0432\u0435\u0449\u0435\u0439. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u043d\u043e\u0441\u0438\u0448\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0410 \u043f\u043e\u0442\u043e\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0430\u0434 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0444\u0438\u0447\u0435\u0439, \u043c\u0435\u043d\u044f\u0435\u0448\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 make \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0435\u0431\u0435 <em>\u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c<\/em> \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445. \u042d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u0440\u044b \u0441\u043e\u0442\u0435\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0451 \u0442\u0435 \u0436\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 Windows \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u041e\u0421 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u0430.<\/p>\n<p>\u041d\u043e \u0432\u0435\u0434\u044c \u0432 docker \u0443 \u043d\u0430\u0441 Ubuntu, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0418\u043b\u0438 \u043d\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435\u2026 \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043e\u0432 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 docker \u0434\u043b\u044f Windows, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u041e\u0421 (\u043d\u0443 \u0438 \u043d\u0430 Linux \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a \u0441 docker, \u0442\u0430\u043a \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e).<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<\/th>\n<th>\n<p>Bind Mount<\/p>\n<\/th>\n<th>\n<p>Volume<\/p>\n<\/th>\n<th>\n<p>Local (no docker)<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Linux<\/p>\n<\/td>\n<td>\n<p align=\"left\">10\u0441\u0435\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014\/\/\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014\/\/\u2014<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Windows<\/p>\n<\/td>\n<td>\n<p align=\"left\">~640\u0441\u0435\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">20\u0441\u0435\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">~90\u0441\u0435\u043a<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b docker\u2019\u0430 \u043d\u0430 Windows \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Windows_Subsystem_for_Linux\">WSL<\/a>, \u0438 \u0432\u0441\u0451 <em>\u0432\u0435\u0441\u0435\u043b\u044c\u0435<\/em> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043b\u0435\u0436\u0430\u0442 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u0438\u043d\u0434\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0434\u0430\u0436\u0435 \u043d\u0430 \u0432\u0438\u043d\u0434\u0435. \u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Bind Mount, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432\u0438\u0434\u0438\u043c\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0443 \u0441\u0435\u0431\u044f \u0432\u043d\u0443\u0442\u0440\u0438, \u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f 10 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438\u2026<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b <s>\u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439<\/s> \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043c\u044b \u0438\u043c\u0435\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 VSCode, \u043c\u043e\u0433\u0443\u0442 \u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 <a href=\"https:\/\/code.visualstudio.com\/docs\/devcontainers\/containers\">https:\/\/code.visualstudio.com\/docs\/devcontainers\/containers<\/a>. \u0418 \u044d\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 volume, \u0438 \u0433\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f VSCode \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 (\u0445\u043e\u0442\u044f \u0432\u0440\u043e\u0434\u0435 \u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0439), \u043f\u043b\u044e\u0441 \u043f\u043e\u043a\u0430 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a \u0432 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 git\u2019\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0449\u0451 \u0434\u043b\u044f Windows \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 WSL, \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 bind mount. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 WSL \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0435\u043b\u0430\u0442\u044c bind mount \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u0442\u0443\u0434\u0430 \u0436\u0435. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f git\u2019\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f gitkraken, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 Git-\u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043b\u044f WSL (\u043e\u043d \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 WSL, \u043d\u043e \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e <a href=\"https:\/\/help.gitkraken.com\/gitkraken-client\/windows-subsystem-for-linux\/\">https:\/\/help.gitkraken.com\/gitkraken-client\/windows-subsystem-for-linux\/<\/a>). \u0412 \u0446\u0435\u043b\u043e\u043c, \u044d\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e WSL2.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 rsync \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u043f\u043a\u043e\u0439 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0432 Linux \u0438 \u043d\u0430 Windows.<\/p>\n<pre><code class=\"bash\">docker run -t -d --name firmware -v \\\\\\\\wsl.localhost\\\\Ubuntu\\\\home\\\\faruk\\\\my_project:\/my_project firmware rsync -ar --exclude .git --exclude .vscode --delete ~\/my_project\/ \/mnt\/c\/Users\/my_project\/<\/code><\/pre>\n<p>\u0425\u043e\u0442\u044f \u0438 \u0441 \u043d\u044e\u0430\u043d\u0441\u0430\u043c\u0438, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0430\u0436\u0435 \u0447\u0443\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e (~26\u0441\u0435\u043a \u0441\u0431\u043e\u0440\u043a\u0430 + \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430).<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7ee\/e9a\/f20\/7eee9af207e9949c0dd304ca8f58da2a.jpg\" alt=\" Docker \u043d\u0430 Windows  vs  Docker \u043d\u0430 Linux\" title=\" Docker \u043d\u0430 Windows  vs  Docker \u043d\u0430 Linux\" width=\"809\" height=\"265\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ee\/e9a\/f20\/7eee9af207e9949c0dd304ca8f58da2a.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption> Docker \u043d\u0430 Windows  <em>vs  <\/em>Docker \u043d\u0430 Linux<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u0440\u043e \u0441\u0431\u043e\u0440\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u043e\u0432, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0443 \u043d\u0430\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435..<\/p>\n<blockquote>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c IoT-\u043c\u043e\u0434\u0443\u043b\u0438 \u043a\u0430\u043a \u043d\u0430 \u0447\u0438\u043f\u0430\u0445 ST, \u0442\u0430\u043a \u0438 \u043d\u0430 NXP, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u043e\u0432\u0438\u0434\u0443 \u0438 \u0447\u0438\u043f\u043e\u0433\u0435\u0434\u0434\u043e\u043d\u0443. \u0418 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u044b\u0445 \u0447\u0438\u043f\u0430\u0445, \u0438 \u043d\u0430 \u043b\u044e\u0431\u044b\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 \u0447\u0438\u043f\u043e\u0432, \u0438 \u043d\u0430 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0447\u0438\u043f\u0430\u0445, \u043d\u043e \u0441 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0439 \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u043e\u0439. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0435\u0449\u0451 \u0442\u043e\u0442, \u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0439\u0442\u0438 \u0432\u0441\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e-\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u2014 \u0441\u043b\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d \u043e\u0442 \u0436\u0435\u043b\u0435\u0437\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0443\u0436\u0438\u0432\u0430\u0435\u043c 50+ \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 IoT-\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043d\u0430\u0447\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<\/blockquote>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0440\u0435\u043b\u0438\u0437 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u0441\u043d\u0443\u043b\u0438\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u043e\u0432, \u043f\u043b\u044e\u0441 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a-\u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432. \u0418 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 Windows, \u0442\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u043b\u0438\u0437 (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a), \u043d\u0443, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0434\u0430\u2026<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/775\/a92\/bc8\/775a92bc862406cd678beecac09b2e14.png\" alt=\" \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u043b\u0438\u0437 \u043d\u0430 Windows.\" title=\" \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u043b\u0438\u0437 \u043d\u0430 Windows.\" width=\"4000\" height=\"4000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/775\/a92\/bc8\/775a92bc862406cd678beecac09b2e14.png\"\/><\/p>\n<div><figcaption> \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u043b\u0438\u0437 \u043d\u0430 Windows.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, docker \u043d\u0430\u043c \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u0432 <a href=\"https:\/\/about.gitlab.com\/topics\/ci-cd\/\">CI\/CD<\/a>, \u0430 \u0442\u0430\u043c \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430. \u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0442\u043e\u0436\u0435 \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445\u2026 \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c gitlab-\u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>gitlab-ci.yml<\/code> \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f runner\u2019\u0430 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0430\u0448 \u043e\u0431\u0440\u0430\u0437 \u0441 Python \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0442.\u0435. \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 script) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b <code>.\/builder.sh build all<\/code>, \u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, push \u0432 master \u0438\u043b\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0442\u0435\u0433\u0430) \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432. \u0410 \u0442\u0430\u043c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u043a\u043e, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u0410 \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u043e \u0437\u0430\u043f\u0430\u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c docker \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u0441\u0435\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 Linux \u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438, \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0438\u0434\u0435\u044f:<\/p>\n<blockquote>\n<p>\u0410 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e <em>\u043f\u043e\u0441\u0430\u0434\u0438\u0442\u044c<\/em> \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 <em>\u043d\u0430 \u043e\u0434\u043d\u0443 \u043c\u0430\u0448\u0438\u043d\u0443?<\/em><\/p>\n<\/blockquote>\n<p>\u041f\u043e \u0438\u0434\u0435\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u0432\u043e\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u043e\u043c \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0434\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u041d\u0430\u0437\u0432\u0430\u043b\u0438 \u043c\u044b \u044d\u0442\u043e <strong><em>Build Server<\/em><\/strong> (\u0434\u0430-\u0434\u0430, \u043d\u0435\u0439\u043c\u0438\u043d\u0433 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e <a href=\"https:\/\/www.techtarget.com\/searchsoftwarequality\/definition\/Build-Server\">\u043f\u0443\u0442\u0430\u0442\u044c<\/a>).<\/p>\n<h4>\u0421\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438, \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0438\u043c\u0435\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0411\u0443\u0434\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434\u044b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c. \u0410 \u0432\u043e\u043e\u0431\u0449\u0435, \u0435\u0441\u043b\u0438 \u0433\u0443\u0433\u043b\u0438\u0442\u044c \u043f\u0440\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 embedded, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u043e\u043b\u043a\u043e\u043c \u0438 \u043d\u0435 <a href=\"https:\/\/blog.golioth.io\/golioth-hil-testing-part1\/\">\u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f<\/a>. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u0441\u043c\u0443\u0442\u0438\u043b\u043e, \u043d\u043e \u0440\u0443\u043a\u0438 \u0442\u0430\u043a \u0438 \u0447\u0435\u0441\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u2014 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043d\u043e\u0432\u0430\u044f. \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0451\u0434, \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u0430\u043b\u043e \u043d\u0430\u043c \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432:<\/p>\n<ul>\n<li>\n<p>\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u043e \u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u043e\u0442\u043b\u0430\u0434\u043a\u0443 (\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 embedded \u2014 \u044d\u0442\u043e \u043d\u0435 \u043d\u043e\u0432\u043e\u0435, \u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u043e, \u0447\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u0448\u0438 \u0437\u0430\u0434\u0430\u0447\u0438);<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0438\u0434\u0451\u0442 \u043d\u0435 \u0442\u0430\u043a, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432 \u0447\u0451\u043c-\u0442\u043e, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441 \u0442\u0432\u043e\u0438\u043c \u041f\u041a (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0442\u044b \u043d\u0430 Windows\u2026 \u041b\u0430\u0434\u043d\u043e-\u043b\u0430\u0434\u043d\u043e, \u044f \u043d\u0435 \u0445\u0435\u0439\u0442\u0435\u0440 \u0432\u0438\u043d\u0434\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c);<\/p>\n<\/li>\n<li>\n<p>\u0443\u0434\u043e\u0431\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u043d\u0430 \u043d\u0451\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0436\u0438\u0432\u0451\u0442 \u043d\u0430\u0448 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442 \u0438 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0441 \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430 (\u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u0432) \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e SSH \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u0442\u044c \u0438 \u0440\u0430\u0441\u043a\u0430\u0442\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u043d\u0430\u0448\u0438\u0445 DevOps \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 \u0432 \u0446\u0435\u043b\u044f\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043e\u0444\u0438\u0441\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 VPN. \u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u0441 Ubuntu, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 arm-none-eabi \u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0430, Python \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e SSH \u0441 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u0442\u043e\u044f\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0432\u0441\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0438\u0445 \u0431\u044b\u043b\u0438 \u0441\u0432\u043e\u0438 \u0443\u0447\u0451\u0442\u043a\u0438 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438. \u0410 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0440\u0435\u0448\u0435\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0439\u0442\u0438 \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u043a \u0433\u0443\u0433\u043b\u0443 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u00abAnsible \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432 \u0437\u0430 0,5 \u0441\u0435\u043a\u0443\u043d\u0434\u00bb\u2026 \u041f\u043e\u043b\u0434\u043d\u044f \u0441\u043f\u0443\u0441\u0442\u044f \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 (\u0444\u0430\u0439\u043b <code>bs_config.yaml<\/code>):<\/p>\n<pre><code class=\"yaml\">- hosts: localhost   become: true   vars:     bs_users:       developerone:         pass: 'strongestpasswordever'         ssh_key: ssh-rsa blaBlalba              developertwo:         pass: 'secondstrongestpassword'         ssh_key: ssh-rsa BlablaBla   tasks:     - name: debug       debug:         msg: \"{{ item }} : {{ bs_users[item]['pass'] }} - {{ bs_users[item]['ssh_key'] }}\"       with_items: \"{{ bs_users.keys() | list }}\"        - name: Create user       user:         name: \"{{ item }}\"         password: \"{{ bs_users[item]['pass'] }}\"         groups:         - docker         - sudo         state: present         system: no         createhome: yes       with_items: \"{{ bs_users.keys() | list }}\"      - name: Set authorized key       ansible.posix.authorized_key:         user: \"{{ item }}\"         key: \"{{ bs_users[item]['ssh_key'] }}\"         state: present         exclusive: true       with_items: \"{{ bs_users.keys() | list }}\"<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0442\u044c ssh-\u043a\u043b\u044e\u0447\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 .yaml \u0444\u0430\u0439\u043b \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c playbook \u043d\u0430 \u0431\u0438\u043b\u0434-\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>ansible-playbook bs_config.yaml<\/code>.<\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0448\u044c \u044d\u0442\u043e \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0448\u044c \u0434\u0435\u0432\u043e\u043f\u0441\u043e\u0432\u043e\u0433\u043e \u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u0430, \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043c\u0430\u0433\u0438\u044e. \u041c\u043e\u0436\u043d\u043e \u0432 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0444\u0438\u0433 \u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0446\u0435\u043b\u0443\u044e \u043a\u0443\u0447\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u043d\u0430 \u0441\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u041c\u041a, \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c \u043f\u043e\u043c\u043e\u0440\u0433\u0430\u0442\u044c, <code>ansible-playbook config.yaml<\/code> \u2014 \u044d\u0442\u043e \u0432\u0438\u043d\u0433\u0430\u0440\u0434\u0438\u0443\u043c \u043b\u0435\u0432\u0438\u043e\u0441\u0430, \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 Git, \u043d\u043e \u0442\u0443\u0442 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043d\u0446\u0435\u0432 \u0441 \u0431\u0443\u0431\u043d\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 Windows (\u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u0433\u043e\u0432\u043e\u0440\u044e \u0432\u0430\u043c, \u044f \u043d\u0435 \u0445\u0435\u0439\u0442\u0435\u0440) \u0441\u0434\u0435\u043b\u0430\u0442\u044c SSH Agent Forwarding. \u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 SSH-\u043a\u043b\u044e\u0447, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435. \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0430\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Git.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u043c\u043d\u0435 public key, \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u043d\u0430 Build Server \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ansible. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043c \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>git clone<\/code>. \u0422\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 agent forwarding. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442 \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043d\u043e\u0443\u0442\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0442\u043e\u0442 \u0436\u0435 public key \u0432 \u0441\u0432\u043e\u044e \u0443\u0447\u0451\u0442\u043a\u0443 \u0432 gitlab, \u043e\u043d \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>git clone<\/code>. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0438\u0431\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>gitlab login<\/code>, \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043b\u044e\u0447, \u043d\u043e \u0443\u0436\u0435 \u043d\u0430 Build Server \u0438 \u0443\u0436\u0435 \u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0441\u0435\u0431\u0435 \u0432 gitlab. \u041d\u043e \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u0438, \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043e\u043d\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e.<\/p>\n<p>\u0415\u0449\u0451 \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e VSCode, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438 \u0437\u0434\u0435\u0441\u044c \u043e\u043d \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u044b\u043c. \u0412 VSCode \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0432\u0435\u0449\u044c, \u043a\u0430\u043a remote extension \u0434\u043b\u044f SSH. \u0414\u0435\u0442\u0430\u043b\u0435\u0439 \u043f\u0440\u043e \u0432\u043d\u0443\u0442\u0440\u044f\u043d\u043a\u0443 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e. \u0422\u043e \u0436\u0435 \u043e\u043a\u043d\u043e, \u0442\u043e\u0442 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0434\u0430\u0436\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0442\u0435 \u0436\u0435 (\u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f remote).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1ad\/caa\/4c3\/1adcaa4c34cd539f148c18591af6500b.png\" alt=\" \u041d\u0430\u0439\u0434\u0438\u0442\u0435 5 \u043e\u0442\u043b\u0438\u0447\u0438\u0439.\" title=\" \u041d\u0430\u0439\u0434\u0438\u0442\u0435 5 \u043e\u0442\u043b\u0438\u0447\u0438\u0439.\" width=\"1920\" height=\"1042\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ad\/caa\/4c3\/1adcaa4c34cd539f148c18591af6500b.png\"\/><\/p>\n<div><figcaption> \u041d\u0430\u0439\u0434\u0438\u0442\u0435 5 \u043e\u0442\u043b\u0438\u0447\u0438\u0439.<\/figcaption><\/div>\n<\/figure>\n<h4>\u041e\u0442\u043b\u0430\u0434\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0430\u044f<\/h4>\n<p>\u0427\u0442\u043e \u0436, \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443, \u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 IoT-\u043c\u043e\u0434\u0443\u043b\u0435, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u0442\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u2014 \u044d\u0442\u043e \u0437\u0430\u0432\u0443\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u041f\u041e \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043b\u044e\u0431\u043e\u0433\u043e \u041f\u041e), \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a IoT \u043c\u043e\u0434\u0443\u043b\u044e, \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0410 \u043f\u043e\u0441\u043b\u0435 \u0441\u0430\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0434\u0435\u0431\u0430\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043f\u0430\u0443\u0437\u0443, \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0421\u043b\u043e\u0432\u043e\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438. \u042d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u041f\u041e \u0434\u043b\u044f embedded-\u0441\u0438\u0441\u0442\u0435\u043c.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0438\u0448\u0435\u0448\u044c \u043a\u043e\u0434, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u0430, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e \u043a \u0442\u0432\u043e\u0435\u043c\u0443 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0443, \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0448\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0434\u0435\u0431\u0430\u0436\u0438\u0448\u044c. \u0414\u0430\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d (\u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u043b\u0435\u0437\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0434\u0442\u0438 \u043d\u0430 Stack Overflow).<\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0431\u044b\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430? \u0418\u043b\u0438 \u0435\u0441\u043b\u0438 IoT \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u043e\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0433\u043e\u0440\u043e\u0434\u0435?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/ecb\/1eb\/0ae\/ecb1eb0ae8a18d4f4430c7ff77558d13.jpg\" width=\"754\" height=\"746\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ecb\/1eb\/0ae\/ecb1eb0ae8a18d4f4430c7ff77558d13.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c, \u043d\u0443\u0436\u043d\u043e \u0433\u043b\u0443\u0431\u0436\u0435 \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0432 \u0442\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0431\u0430\u0433. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f arm-none-eabi-gdb \u2014 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0441 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 arm.<\/p>\n<details class=\"spoiler\">\n<summary>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e GDB<\/summary>\n<div class=\"spoiler__content\">\n<p><a href=\"https:\/\/www.sourceware.org\/gdb\/\">GDB<\/a> \u2014 \u044d\u0442\u043e GNU Debugger \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GCC. \u042d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0434\u0435\u0431\u0430\u0433\u0430, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u044b \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0431\u044d\u043a\u0435\u043d\u0434\u044b. \u0422\u0430\u043a\u0436\u0435 \u0443 GDB \u0435\u0441\u0442\u044c \u043e\u043f\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/p>\n<\/div>\n<\/details>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c \u043f\u0440\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e \u043e\u0442\u043b\u0430\u0434\u043a\u0443, \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u0443\u044e \u0412\u0438\u043a\u0438:<\/p>\n<blockquote>\n<p>\u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 GDB \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0430 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u0421\u0432\u044f\u0437\u044c \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0438\u043b\u0438 TCP\/IP. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u043d \u0434\u043b\u044f GDB, \u043d\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 \u0430\u0440\u0445\u0438\u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430. \u041a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430, \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 gdbserver \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 GDB, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u043e\u0447\u0435\u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c \u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a ARM Cortex M, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c gdbserver. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0445\u0430\u0440\u0434\u0432\u0430\u0440\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 breakpoint\u2019\u043e\u0432, stepping\u2019\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 (pin \u2014 \u043d\u043e\u0436\u043a\u0438). \u0423 arm\u2019\u043e\u0432\u0441\u043a\u0438\u0445 \u0447\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c SWD \u0438\u043b\u0438 JTAG. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043b\u0443\u0436\u0438\u043b\u043e \u0431\u044b \u043c\u043e\u0441\u0442\u043e\u043c \u043c\u0435\u0436\u0434\u0443 gdbserver \u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, STLink, J-Link, BlackMagic \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u043e\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 open source (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, OpenOCD.<\/p>\n<p>\u0421\u043d\u043e\u0432\u0430 \u0412\u0438\u043a\u0438:<\/p>\n<blockquote>\n<p>\u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0432\u0435\u0434\u0443\u0449\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/FSF\">FSF<\/a>, GDB \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8\">IDE<\/a>, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430\u043c \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c gdb \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0432\u044b\u0432\u043e\u0434. \u041d\u043e \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0410 \u0435\u0441\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043e\u0442\u043c\u0435\u0442\u044c\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441\u043e \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430\u043c\u0438&#8230;<\/p>\n<p>\u0412 VSCode, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 gdb \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c (\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c breakpoint\u2019\u044b \u043c\u044b\u0448\u043a\u043e\u0439 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435, \u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/Marus\/cortex-debug\">cortex-debug<\/a>.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0442\u0430\u0451\u0442 \u043b\u0438\u0448\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u0430 \u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043f\u043e\u0434 \u043d\u0435\u0433\u043e. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0430\u0448\u0435\u043c \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0435 \u0435\u0441\u0442\u044c \u0438 ST\u2019\u0448\u043d\u044b\u0435 \u0447\u0438\u043f\u044b, \u0438 NXP, \u0442\u043e STLink \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u041f\u043e\u043c\u0438\u043c\u043e \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 J-Link, \u0438 \u0441 \u043d\u0438\u043c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0434\u0440\u0443\u0436\u0430\u0442 \u043e\u0431\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043d\u0430\u043c\u0438 \u0447\u0438\u043f\u0430, \u043d\u043e \u0443 J-Link \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <a href=\"https:\/\/www.segger.com\/products\/debug-probes\/j-link\/tools\/j-link-remote-server\/\">\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0431\u0430\u0433\u0430<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u043f\u043b\u0430\u043d \u0411. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/black-magic.org\/index.html\">Black Magic Probe<\/a>. \u041f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439, \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u0436\u0438\u0432\u043e\u0435, \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0435\u0449\u0451 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0447\u0438\u043f\u044b. \u0412\u043e\u0442 \u0435\u0433\u043e \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c.<\/p>\n<blockquote>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u043e\u0448\u043b\u0438 \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u043d\u0443\u0436\u0434 \u0434\u0432\u0435 \u0441\u043e\u0442\u043d\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u043e\u0432, \u0444\u043e\u0440\u043a\u043d\u0443\u043b\u0438 <a href=\"https:\/\/github.com\/blackmagic-debug\/blackmagic\/tree\/main\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a> BMP \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432\u0441\u0435\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0435, \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u043a \u0432\u0435\u043d\u0434\u043e\u0440\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0436\u0435\u043b\u0435\u0437\u043e \u0438 \u0441\u043e\u0444\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e\u0431 \u044d\u0442\u043e\u043c \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.  <\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0fd\/575\/c59\/0fd575c59d0e12fed5db4dddfc4388e7.png\" alt=\"https:\/\/github.com\/compuphase\/Black-Magic-Probe-Book\" title=\"https:\/\/github.com\/compuphase\/Black-Magic-Probe-Book\" width=\"880\" height=\"212\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0fd\/575\/c59\/0fd575c59d0e12fed5db4dddfc4388e7.png\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/github.com\/compuphase\/Black-Magic-Probe-Book\">https:\/\/github.com\/compuphase\/Black-Magic-Probe-Book<\/a><\/figcaption><\/div>\n<\/figure>\n<p>BMP \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f gdbserver, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u043a \u0445\u043e\u0441\u0442\u0443, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a serial port. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 gdb \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 proof of concept \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c IoT \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u044c. \u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f: \u043d\u043e\u0443\u0442\u0431\u0443\u043a \u0441\u043e \u0441\u0440\u0435\u0434\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443; \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c IoT-\u043c\u043e\u0434\u0443\u043b\u044c; Black Magic Probe, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u043a IoT; \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a (\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 OrangePi), \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f Black Magic; \u0438 \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0432 \u0441\u0435\u0442\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a\u0435, BMP, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043f\u043e USB, \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a serial port, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d <em>\u0438\u0437\u0432\u043d\u0435.<\/em> \u0410 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/cminyard\/ser2net\">ser2net<\/a>. \u0418\u0442\u0430\u043a, \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0434\u0435\u043b\u0430\u0435\u043c make build, \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c gdb, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0442\u0430\u0440\u0433\u0435\u0442\u0443 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>{IP \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a\u0430}:{\u043f\u043e\u0440\u0442 ser2net}<\/code>, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u041c\u041a \u043d\u0430 IoT\u2019\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043c\u043d\u0430\u0442\u044b halt, flash, reset \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u0438 \u0434\u0435\u0431\u0430\u0433\u0430.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f ser2net, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u0440\u043e\u0441 BMP \u0432 \u043f\u043e\u0440\u0442\u044b 3000 \u0438 3001 (\u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0440\u0442\u043e\u0432, \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0435\u0441\u0442\u044c gdbserver, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u0443\u0436\u0438\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a uart\u2019\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u0430):<\/p>\n<pre><code class=\"yaml\">%YAML 1.1 --- # This is a ser2net configuration file, tailored to be rather # simple. # # Find detailed documentation in ser2net.yaml(5) # A fully featured configuration file is in # \/usr\/share\/doc\/ser2net\/examples\/ser2net.yaml.gz # # If you find your configuration more useful than this very simple # one, please submit it as a bugreport  define: &amp;banner \\r\\nser2net port \\p device \\d [\\B] (Debian GNU\/Linux)\\r\\n\\r\\n  connection: &amp;con0192     accepter: tcp,3000     enable: on     options:       banner: *banner       kickolduser: true       telnet-brk-on-sync: true     connector: serialdev,               \/dev\/bmp_gdb,               115200n81,local nobreak  connection: &amp;con1192     accepter: tcp,3001     enable: on     options:       banner: *banner       kickolduser: true       telnet-brk-on-sync: true     connector: serialdev,               \/dev\/bmp_serial,               115200n81,local nobreak<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u0435\u043a\u0438\u0439 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0443\u0437\u0435\u043b, \u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u044b \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043b\u0438, <strong>Debug Node.<\/strong> \u041e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a\u0430 \u0441 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d BMP, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u043a IoT. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 IoT \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435, \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 IoT \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043d\u0430\u043c \u0441\u0435\u0442\u0438. \u0418 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0441\u0432\u043e\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c VPN.<\/p>\n<p>\u041d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u043c\u0435\u043b\u044c\u043a\u043d\u0443\u043b \u0445\u0432\u043e\u0441\u0442\u043e\u043c <a href=\"https:\/\/tailscale.com\/\">Tailscale<\/a>, \u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0448\u0430\u043d\u0441. \u041a\u043e\u043c\u0443 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0437\u0432\u0435\u0440\u044f \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u0441\u043e\u0432\u0435\u0442\u0443\u044e <a href=\"https:\/\/tailscale.com\/blog\/how-tailscale-works\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c<\/a> \u0441\u0430\u043c\u0438\u043c, \u0430 \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u0440\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d. \u042f \u043b\u0438\u0448\u044c \u043e\u043f\u0438\u0448\u0443, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0423 Tailscale \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 Tier. \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c open source \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f control server\u2019\u0430 \u0434\u043b\u044f Tailscale, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/juanfont\/headscale\/tree\/main\">Headscale<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u043a\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>This project is not associated with Tailscale Inc. However, one of the active maintainers for Headscale\u00a0<a href=\"https:\/\/tailscale.com\/blog\/opensource\">is employed by Tailscale<\/a>\u00a0and he is allowed to spend work hours contributing to the project. Contributions from this maintainer are reviewed by other maintainers.<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Headscale \u043c\u044b \u043e\u0442\u0434\u0430\u043b\u0438 \u0434\u0435\u0432\u043e\u043f\u0441\u0430\u043c, \u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u0441\u0435\u0442\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Debug Node (\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a\u0438):<br \/> <code>tailscale up --login-server &lt;https:\/\/ourserver.com\/> --accept-dns=true --auth-key=ourkeyfromheadscale<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e09\/127\/3ea\/e091273ea58082ed35def650a6fdac32.png\" alt=\" \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" title=\" \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" width=\"1578\" height=\"522\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e09\/127\/3ea\/e091273ea58082ed35def650a6fdac32.png\"\/><\/p>\n<div><figcaption> \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/633\/942\/b36\/633942b362549b4eda5eba040f601297.png\" alt=\" \u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0438\u043c\u0435\u043d\u0435\u043c, \u0433\u0440\u0443\u043f\u043f\u043e\u0439 \u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u043c.\" title=\" \u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0438\u043c\u0435\u043d\u0435\u043c, \u0433\u0440\u0443\u043f\u043f\u043e\u0439 \u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u043c.\" width=\"1240\" height=\"566\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/633\/942\/b36\/633942b362549b4eda5eba040f601297.png\"\/><\/p>\n<div><figcaption> \u0410 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0438\u043c\u0435\u043d\u0435\u043c, \u0433\u0440\u0443\u043f\u043f\u043e\u0439 \u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u044e \u0441\u0435\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043c\u0438\u0440\u0430 \u0438 \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 IP-\u0430\u0434\u0440\u0435\u0441\u0443. \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0435\u043d\u0434\u043e\u0432. \u0422\u0430\u043a\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u043c\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u044b\u0445 IoT-\u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u041e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0435\u043d\u0434 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0443\u044e \u0445\u0430\u0440\u0434\u0432\u0430\u0440\u043d\u0443\u044e \u043e\u0431\u0432\u044f\u0437\u043a\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0438\u043c\u0435\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0435\u0433\u043e \u0432 \u041a\u0438\u0442\u0430\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e <em>\u0441\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0441 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/em>.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0430\u0441\u0442\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0434\u043b\u044f OrangePi, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442 \u043b\u044e\u0431\u0443\u044e \u043d\u043e\u0432\u0443\u044e \u0430\u043f\u0435\u043b\u044c\u0441\u0438\u043d\u043a\u0443 \u0438\u0437 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u0443 \u043d\u0430\u0448\u0435\u0439 Debug Node. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u0438\u043a \u0438 \u0437\u0430\u043b\u044c\u0451\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0442\u0435\u0440-\u043e\u0431\u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043d\u0430 \u043d\u0451\u043c Tailscale-\u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0432\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438. \u0417\u0430\u0442\u0435\u043c \u0432\u043d\u0435\u0441\u0451\u043c \u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433-\u0444\u0430\u0439\u043b. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e \u043d\u0430\u043c Ansible \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u043e\u0434\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0424\u0430\u0439\u043b <code>inventory.yaml<\/code> \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043d\u043e\u0434 \u0438 \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<pre><code class=\"yaml\">---  debug_nodes:   hosts:     100.64.0.1:       ansible_user: \"dn\"       vars:         name: 0207e6ba6c28         id: 1         comment:         region: MOW      100.64.0.11:       ansible_user: \"dn\"       vars:         name: 0207b8238ff8         id: 2         comment:         region: MOW <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b <code>nodes_config.yaml<\/code> \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0434\u044b.<\/p>\n<pre><code class=\"yaml\">--- - hosts: debug_nodes   become: true   vars:     dn_users:       - \"{{ ansible_user }}\"   tasks:     - name: Set authorized key for admin       ansible.posix.authorized_key:         user: \"{{ ansible_user }}\"         key: ssh-rsa someadminsshkey         state: present         exclusive: true      - name: Create list of users       command: awk -F{{':'}} '$3 >= 1000 &amp;&amp; $1 != \"nobody\" {print $1}' \/etc\/passwd       changed_when: false       register: curr_users      - name: Determine users to be removed       set_fact:         remove_users: \"{{ curr_users.stdout_lines | difference(dn_users) }}\"      - name: Remove user accounts       user:         name: \"{{ item }}\"         state: absent         remove: true       with_items: \"{{ remove_users }}\"      - name: Copy file with rules       copy:         src: dn_files\/99-usb-bmp.rules         dest: \/etc\/udev\/rules.d\/99-usb-bmp.rules      - name: Restart udev       shell: udevadm control --reload-rules &amp;&amp; udevadm trigger      - name: Install ser2net       apt:         name: ser2net         state: present      - name: Copy file ser2net config       copy:         src: dn_files\/ser2net.yaml         dest: \/etc\/ser2net.yaml      - name: Start ser2net       service:         name: ser2net         state: started      - name: Add ser2net restart cmd to cron       shell: |         echo \"@reboot sleep 10 &amp;&amp; sudo service ser2net restart\" >> ser2net-restart-cron         crontab ser2net-restart-cron         rm ser2net-restart-cron         crontab -l      - name: Set a hostname       hostname:         name: \"{{ ansible_user }}-{{ hostvars[inventory_hostname]['vars']['id'] }}-{{ hostvars[inventory_hostname]['vars']['name'] }}\"      - name: Unconditionally reboot the machine with all defaults       reboot: <\/code><\/pre>\n<p>\u041c\u0430\u0433\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0434\u0435\u043b\u0430\u0435\u0448\u044c:<\/p>\n<p><code>ansible-playbook -i inventory.yaml nodes_config.yaml<\/code><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448\u0438 Debug Node \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c wifi, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u0430\u043c \u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443. \u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043d\u0430\u0448\u0435\u043c proof of concept, \u043d\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Tailscale-\u0441\u0435\u0442\u0438.<\/p>\n<h4>\u0415\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0431\u0435\u043b\u044c<\/h4>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u0441\u0431\u043e\u0440\u043a\u0430, \u043e\u0442\u043b\u0430\u0434\u043a\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0438 \u0437\u0434\u0435\u0441\u044c, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043d\u044e\u0430\u043d\u0441\u043e\u0432. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 IoT \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0437\u0430 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434. \u0412\u0435\u0441\u0438\u0442 \u043e\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u0434\u0430 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439. \u041d\u0443 \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0438\u043d\u0433 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439, \u0442\u043e \u0438 \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 gdb-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u2014 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435, \u0434\u0430\u0436\u0435 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0448\u044c \u043d\u0430 \u044d\u0442\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u043d\u0430 \u041c\u041a \u0438 \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e?<\/p>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0438\u0434\u0438\u0442 \u0432 \u043e\u0444\u0438\u0441\u0435 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0437\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u043e\u043c, \u0443 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442 VSCode, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043a Build Server\u2019\u0443. BS, \u043a \u0441\u043b\u043e\u0432\u0443, \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u0443\u0433\u043e\u043b\u043a\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b. \u0422\u0430\u043c \u0443 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 IoT, \u0438, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043b\u0435\u0436\u0438\u0442 \u0443\u0436\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 F5 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435, \u0438 \u044d\u0442\u0430 \u0436\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 Build Server. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430 \u043d\u0451\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f gdb-\u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a gdb-\u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 Debug Node \u0432 \u0441\u0435\u0442\u0438 Tailscale. \u041f\u0440\u0438\u0447\u0451\u043c, \u043f\u043e\u0440\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f serial \u043f\u043e\u0440\u0442\u043e\u043c, \u043f\u0440\u043e\u043a\u0438\u043d\u0443\u0442\u044b\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ser2net \u043e\u0442 BMP, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e \u043a OrangePi \u043f\u043e USB.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7ca\/7c3\/5e6\/7ca7c35e60982343391932f45cfb4b12.png\" alt=\" \u042f \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u043a\u0430\u043a \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Debug Node\u2019\u0430\u0445\" title=\" \u042f \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u043a\u0430\u043a \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Debug Node\u2019\u0430\u0445\" width=\"577\" height=\"433\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ca\/7c3\/5e6\/7ca7c35e60982343391932f45cfb4b12.png\"\/><\/p>\n<div><figcaption> \u042f \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u043a\u0430\u043a \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Debug Node\u2019\u0430\u0445<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442\u2026<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u043f\u0438\u043d\u0433. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e gdb-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0447\u0442\u043e-\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (\u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442), \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442 (ack), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u043e\u0432\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u0431\u043b\u043e\u043a\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u043e \u0441\u0443\u0442\u0438, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u043e, \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0442 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0430\u0441\u0442\u0435\u0439, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0430 \u0434\u0432\u0430 (\u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u043c OK \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430) \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043f\u0438\u043d\u0433 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u0431\u0443\u0434\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0442\u043b\u0430\u0434\u043a\u0435.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441: \u043a\u0430\u043a \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430? \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <a href=\"https:\/\/www.embecosm.com\/appnotes\/ean4\/html\/ch03s02s01.html\">\u043a\u043e\u043d\u043d\u0435\u043a\u0442<\/a> \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0438\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043d\u0430 \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d, \u043a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u043d\u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/sourceware.org\/gdb\/current\/onlinedocs\/gdb.html\/General-Query-Packets.html#:~:text=%E2%80%98-,qSupported,-%5B%3Agdbfeature\">qSupported<\/a>, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044c. \u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u0440\u043e BMP, \u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/blackmagic-debug\/blackmagic\/blob\/main\/src\/include\/gdb_main.h\">\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435<\/a> \u0441\u0430\u043c\u043e\u0433\u043e \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 \u2014 <code>#define GDB_PACKET_BUFFER_SIZE 1024U<\/code>, \u0430 \u0435\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430.<\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 1\u043a\u0411, \u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 300\u043a\u0411 \u0438 \u043f\u0438\u043d\u0433\u0435 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0435\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0427\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0430 \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043e 32\u043a\u0411). \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u044d\u0442\u043e\u043c\u0443, \u0438 \u043d\u0430\u043c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/b09\/30b\/e74\/b0930be74508fa7fda3c127debff2e7e.jpg\" alt=\" \u041a\u043e\u0433\u0434\u0430 \u0431\u0430\u0433\u0430 \u0432 \u0434\u0435\u0431\u0430\u0433\u0435, \u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0431\u0430\u0433 \u0434\u0435\u0431\u0430\u0433\u0435\u0440\u0430\" title=\" \u041a\u043e\u0433\u0434\u0430 \u0431\u0430\u0433\u0430 \u0432 \u0434\u0435\u0431\u0430\u0433\u0435, \u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0431\u0430\u0433 \u0434\u0435\u0431\u0430\u0433\u0435\u0440\u0430\" width=\"1848\" height=\"1848\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b09\/30b\/e74\/b0930be74508fa7fda3c127debff2e7e.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption> \u041a\u043e\u0433\u0434\u0430 \u0431\u0430\u0433\u0430 \u0432 \u0434\u0435\u0431\u0430\u0433\u0435, \u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0431\u0430\u0433 \u0434\u0435\u0431\u0430\u0433\u0435\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<h4>\u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041c\u044b \u043f\u043e\u0436\u0435\u043b\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438, \u0430 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0432 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435 CI\/CD, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 (\u0447\u0442\u043e, \u043a\u0430\u043a \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u044c \u0434\u043b\u044f embedded) \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u0443\u044e (\u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e) \u043e\u0442\u043b\u0430\u0434\u043a\u0443. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u043a\u0430, \u0430 \u0446\u0435\u043b\u044b\u0439 \u044d\u043f\u0438\u043a, \u0438 \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u0443 \u043c\u0435\u043d\u044f \u043e\u043d \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0430\u043c \u0431\u044b\u043b\u043e \u0442\u0430\u043a \u0436\u0435 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u043c\u043d\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0421 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0436\u0434\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \ud83d\ude09<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/825330\/\"> https:\/\/habr.com\/ru\/articles\/825330\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u0435\u0440\u0434\u0446\u0435 \u0438 \u043c\u043e\u0437\u0433 \u043b\u044e\u0431\u043e\u0433\u043e \u0448\u0435\u0440\u0438\u043d\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u0430 \u2014 IoT-\u043c\u043e\u0434\u0443\u043b\u044c: \u043e\u043d <em>\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442<\/em>, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u043a\u0440\u0443\u0433, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <em>\u043c\u044b\u0448\u0446\u0430\u043c\u0438, \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f<\/em> \u0441 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c. \u0412\u0441\u0451, \u0447\u0442\u043e \u043e\u043d \u0437\u043d\u0430\u0435\u0442 \u043e \u043c\u0438\u0440\u0435, \u0438 \u0442\u043e, \u043a\u0430\u043a \u0441\u0435\u0431\u044f \u0432\u0435\u0434\u0451\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439. \u0412 \u043d\u0430\u0448\u0438\u0445 \u0441\u0430\u043c\u043e\u043a\u0430\u0442\u0430\u0445 \u0441\u0442\u043e\u0438\u0442 IoT-\u043c\u043e\u0434\u0443\u043b\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0441\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u043c\u043d\u044e, \u0431\u044b\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u043e\u0442\u0434\u0435\u043b \u0441\u043e\u0441\u0442\u043e\u044f\u043b \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041c\u044b \u0441\u0438\u0434\u0435\u043b\u0438 \u043d\u0430 Windows. \u041f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0430\u0441\u044c \u0432 eclipse-based Atollic True Studio \u0441 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 (\u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, STM32CubeIDE \u043c\u0438\u043d\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u0441). \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 <a href=\"https:\/\/www.gnu.org\/software\/make\/manual\/make.html\">make<\/a>\u2019file, \u0438 \u0434\u043e \u043f\u043e\u0440\u044b \u0434\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0441 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u043e.<\/p>\n<p>\u0428\u043b\u043e \u0432\u0440\u0435\u043c\u044f, Whoosh \u0440\u043e\u0441 \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u0435\u0449\u0451 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442. \u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043e\u0441\u0435\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c Linux \u0438 macOS, \u0430 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0438 \u0447\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043b\u0441\u044f \u0438 \u0441\u0440\u043e\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0430 \u043d\u0435\u2026<\/p>\n<figure class=\"\">\n<div><figcaption> \u0422\u0443\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0443\u043f\u0430\u043b\u043e.<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0443\u0436\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c <a href=\"https:\/\/developer.arm.com\/Tools%20and%20Software\/GNU%20Toolchain\">\u0442\u0443\u043b\u0447\u0435\u0439\u043d\u0430<\/a>) \u0438 make. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043e\u0434\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u043d\u043e \u0441 make\u2019\u043e\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u0441\u0430\u043c\u043e\u0438\u0441\u0442\u044f\u0437\u0430\u043d\u0438\u0435\u043c. \u041d\u0443\u0436\u0435\u043d \u0441\u0430\u043c \u043a\u043e\u0434, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0430 \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u2014 \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <a href=\"https:\/\/code.visualstudio.com\/\">VS Code<\/a> \u2014 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u043c\u0438, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043d\u0438\u0445 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/eclipseide.org\/\">Eclipse<\/a> \u2014 \u0443 \u043d\u0435\u0433\u043e \u0440\u044f\u0434 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0418\u043b\u0438 \u0434\u0430\u0436\u0435 <a href=\"https:\/\/www.vim.org\/\">Vim<\/a>, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e \u0434\u0443\u0448\u0435 \u0445\u0430\u0440\u0434\u043a\u043e\u0440. \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 IDE \u043c\u044b \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438, \u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438: shell, make \u0438 Python.<\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 make<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0441\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435. \u0412 IoT-\u043c\u043e\u0434\u0443\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044f\u0437\u044b\u043a C\u0438. \u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u0435\u0451 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. \u0410 make \u2014 \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0410 \u0442\u0430\u043a\u0436\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043b\u043e\u0432, \u0442\u043e make \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 <em>\u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c<\/em> \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b.<\/p>\n<\/div>\n<\/details>\n<h4>Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0438\u0440\u0438\u0436\u0438\u0440\u0443\u0435\u0442<\/h4>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d \u044f\u0434\u0440\u043e\u043c \u0432\u0441\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u044b\u043b make, \u0442\u043e \u0438 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0442\u0430\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u0430 \u0438 \u0441\u0430\u043c make \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e shell-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 python-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c. \u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u0435\u0440\u0451\u043c Python \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0435\u0433\u043e \u0437\u043d\u0430\u044e\u0442, \u043d\u0430 \u043d\u0451\u043c \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u2026 \u041e\u0431\u0435\u0440\u043d\u0451\u043c \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0451 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u0443 \u042d\u043a\u0437\u044e\u043f\u0435\u0440\u0438: <s>\u0443\u0434\u0430\u0432<\/s> \u043f\u0438\u0442\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0433\u043b\u043e\u0442\u0438\u043b <s>\u0441\u043b\u043e\u043d\u0430<\/s> \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438.<\/p>\n<p>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a: \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Python \u043f\u0430\u0440\u0441\u0438\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 make \u0438 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0438 \u0441\u0430\u043c \u0436\u0435 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043d\u0435 \u0438\u0441\u0442\u0438\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438, \u043d\u043e \u0443 \u043d\u0430\u0441 \u043e\u043d\u043e \u043f\u0440\u0438\u0436\u0438\u043b\u043e\u0441\u044c (\u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c).<\/p>\n<figure class=\"full-width\">\n<div><figcaption> \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0434\u0430\u0432 \u0441\u044a\u0435\u043b \u0430\u043d\u0442\u0438\u043b\u043e\u043f\u0443 \u0433\u043d\u0443.<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u0430\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c Python \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0434\u0430\u0431\u044b \u043d\u0435 \u043c\u0443\u0441\u043e\u0440\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c requirements. \u0412\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u041e\u0421 <em>venv<\/em> \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u0438\u0442\u043e\u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c shell-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0432\u0430\u0435\u0442 <em>venv<\/em> \u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c.<\/p>\n<pre><code class=\"bash\">#!\/usr\/bin\/env bash  if [ \"$OS_NAME\" == \"Darwin\" ]; then     VENV_NAME=virtualenv     VENV_SRC=bin     PYTHON_NAME=python3 elif [ \"$OS_NAME\" == \"Linux\" ]; then     VENV_NAME=venv     VENV_SRC=bin     PYTHON_NAME=python3 elif [ \"$OS_NAME\" == \"Windows_NT\" ]; then     VENV_NAME=venv     VENV_SRC=Scripts     PYTHON_NAME=python fi  if [ -d \".venv\" ]; then     echo .venv exists else     echo there is no .venv     $PYTHON_NAME -m $VENV_NAME .venv     .venv\/$VENV_SRC\/$PYTHON_NAME -m pip install --upgrade pip     .venv\/$VENV_SRC\/pip install -r requirements.txt fi   python_build_script=builds\/fw_builder.py echo Python cmd: .venv\/$VENV_SRC\/$PYTHON_NAME $python_build_script $* .venv\/$VENV_SRC\/$PYTHON_NAME $python_build_script $* <\/code><\/pre>\n<h4>\u0413\u0440\u0430\u0431\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0436\u0438\u0434\u0430\u044e\u0442<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0432\u0430\u0441, \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0432\u0434\u0440\u0443\u0433 \u0440\u0435\u0448\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u0442\u043e \u044f \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043f\u0440\u043e \u0442\u0435 \u0433\u0440\u0430\u0431\u043b\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b \u0441\u0430\u043c.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0437\u0430\u043f\u0443\u0441\u043a \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 make \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 Python \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u0443\u0436 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c. \u0410 \u0435\u0449\u0451 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c <em>\u043d\u0430 \u043b\u0435\u0442\u0443<\/em> \u043b\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 stdout \u0438 stderr. \u041d\u0430 \u043d\u0430\u0448\u0435 \u0441\u0447\u0430\u0441\u0442\u044c\u0435, \u0432 python \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/docs.python.org\/3\/library\/subprocess.html\">subprocess<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441 Windows \u043d\u0435 \u0437\u0430\u0441\u043a\u0443\u0447\u0430\u0435\u0448\u044c. \u0412 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442, \u0445\u043e\u0442\u044f \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Windows, \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e, \u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0430\u0442\u044c. \u0412\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <a href=\"https:\/\/stackoverflow.com\/questions\/68658520\/how-to-bypass-pipe-buffer-size-in-python-windows\">PIPE<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u0444\u0444\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443, \u0438 \u043e\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u041e\u0421. \u041d\u0430 Windows \u2014 4096 \u0411\u0430\u0439\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043f\u044b\u0442\u0430\u0435\u0448\u044c\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430 \u0432\u0438\u043d\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u043e\u0440\u043d\u0438\u043d\u0433\u043e\u0432, stderr \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 deadlock. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u0430 stderr \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0432\u043c\u0435\u0441\u0442\u043e PIPE.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 Python \u0434\u043b\u044f \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f make-\u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0427\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u044f \u0432\u044b\u043f\u0438\u043b\u0438\u043b, \u043d\u043e \u0441\u0443\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430\u0441\u044c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Ctrl+C\/Ctrl+V.<\/p>\n<pre><code class=\"python\">import glob from time import time from tqdm import tqdm from subprocess import PIPE, Popen   reg_ex = r'some_pattern'  def run_cmd(cmd, N=None):     log.info(f'make cmd: {cmd}')     t0 = time()     info_str = '\\n'     bar_fmt = '{l_bar}{bar:20}{r_bar}{bar:-10b}' if N is not None else None     with open('make_err.log', 'w', encoding=\"utf-8\") as err_f:         p = Popen(cmd, shell=True, stdout=PIPE, stderr=err_f)         with tqdm(total=N, bar_format=bar_fmt) as pbar:             with open('make_build.log', 'a', encoding=\"utf-8\") as f:                 while p.poll() is None:                     output = p.stdout.readline()  # type: ignore                     if output:                         output_str = output.decode().rstrip()                         if re.match(reg_ex, output_str):                             f.write(output_str + '\\n')                             pbar.set_postfix_str(output_str)                             pbar.update()                         else:                             info_str += output_str + '\\n'      with open('make_err.log', 'r', encoding=\"utf-8\") as err_f:         std_err = err_f.readlines()      if len(std_err) > MAX_ERR_LINES:         stderr_message = 'Output is too long, please check make_err.log'     elif len(std_err) == 0:         stderr_message = ''     else:         stderr_message = ''.join(std_err)      if stderr_message != '':         if p.returncode != 0:             log.error(stderr_message)         else:             log.warning(stderr_message)      dur = time() - t0     if info_str != '\\n':         log.info(info_str)     log.info(f'execution duration {dur:.1f} sec')      for file in glob.glob(r'debug\/*.bin'):         log.info(f'binary file {file}')      return p.returncode   <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 run_cmd<\/summary>\n<div class=\"spoiler__content\">\n<p><code>reg_ex<\/code> \u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<code>N<\/code> \u043d\u0443\u0436\u043d\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430, \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0430\u0442\u044c \u0435\u0451 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u2014 \u043c\u0435\u043b\u043e\u0447\u044c, \u0430 \u043f\u0440\u0438\u044f\u0442\u043d\u043e. \u0415\u0441\u043b\u0438<code>N<\/code>\u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0442\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a. \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/clang.llvm.org\/docs\/JSONCompilationDatabase.html\">compilation database<\/a> (compile_commands.json), \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/pypi.org\/project\/compiledb\/\">\u0442\u0430\u043a\u043e\u0439<\/a>. \u0410 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e json\u2019\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>Popen<\/code>  \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>make<\/code> \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 poll\u2019\u0438\u043c \u0435\u0451, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f, \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u044b\u0434\u0430\u0451\u0442 \u0432 <code>stdout<\/code> (\u0442\u0443\u0442 \u043d\u0430\u043c \u043a\u0430\u043a \u0440\u0430\u0437-\u0442\u0430\u043a\u0438 \u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>reg_ex<\/code>), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u0438 \u0437\u0430\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0410 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 <code>stderr<\/code> , \u043f\u0438\u0448\u0435\u043c \u0432 \u0444\u0430\u0439\u043b (\u0441\u043d\u043e\u0432\u0430 \u0441\u043f\u0430\u0441\u0438\u0431\u043e Windows). \u041f\u0440\u0438\u043d\u0442\u0443\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u043f\u0440\u043e VSCode. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u2014\u00a0 <a href=\"https:\/\/code.visualstudio.com\/docs\/editor\/tasks\">\u0442\u0430\u0441\u043a\u0438<\/a>. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<pre><code class=\"json\">{     \"version\": \"2.0.0\",     \"windows\": {         \"options\": {             \"shell\": {                 \"executable\": \"cmd.exe\",                 \"args\": [                     \"\/C\", \"sh\"                 ]             }         }     },     \"problemMatcher\": \"$gcc\",      \"tasks\": [         {             \"label\": \"\u274c Clean\",             \"type\": \"shell\",             \"command\": \".\/builder.sh\",             \"args\": [\"clean\"],             \"group\": {                 \"kind\": \"build\",                 \"isDefault\": true             }         },         {             \"label\": \"\u26cf\ufe0f? | Build: app-prd\",             \"type\": \"shell\",             \"command\": \".\/builder.sh\",             \"args\": [\"build\", \"app_prd\"],             \"group\": {                 \"kind\": \"build\",                 \"isDefault\": true             }         }     ] } <\/code><\/pre>\n<p>\u0412\u044b\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e json&#8217;\u0430 (<code>.vscode\/tasks.json<\/code>), \u043f\u043e \u043d\u0435\u043c\u0443 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 <code>make<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 <code>builder.sh<\/code>. \u0410 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0441\u043a\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>run_cmd<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u0422\u0430\u043a, \u043d\u0430\u0436\u0438\u043c\u0430\u044f Ctrl+Shift+B, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u043c\u0435\u043d\u044e, \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-380243","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/380243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=380243"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/380243\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=380243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=380243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=380243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}