{"id":348505,"date":"2023-06-08T15:00:41","date_gmt":"2023-06-08T15:00:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=348505"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=348505","title":{"rendered":"<span>\u0425\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 \u0438\u2026 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439? \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0433\u043b\u0443\u043f\u043e\u0432\u0430\u0442\u044b\u0435, \u043d\u043e \u0443\u0441\u0435\u0440\u0434\u043d\u044b\u0435 AI-\u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/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-1\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0441\u0435\u043d\u0438\u0439, \u044f \u2014 \u0442\u0438\u043c\u043b\u0438\u0434 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 KasperskyOS. \u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u041f\u041e <a href=\"https:\/\/kas.pr\/habr-sapelkin-kos\">\u043f\u043e\u0434 \u043d\u0430\u0448\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u0438\u043a\u0440\u043e\u044f\u0434\u0435\u0440\u043d\u0443\u044e OS<\/a> \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0431\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0430\u0441 \u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u043d\u044b\u043c\u0438. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043c\u044b \u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u0445\u0430\u0439\u043f\u043e\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0437\u043e\u0440 AI-\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rh\/x8\/bx\/rhx8bx0rwjm37adg_t_ep7cizny.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 AI \u043f\u043b\u0430\u0433\u0438\u043d\u044b VSCode:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/features\/copilot\">Copilot<\/a> v1.84.61 \u2014 \u0441\u0430\u043c\u044b\u0439 \u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0438\u0439 \u0440\u043e\u0431\u043e\u0442<\/li>\n<li><a href=\"https:\/\/www.tabnine.com\/\">Tabnine<\/a> v3.6.45 \u2014 \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439<\/li>\n<li><a href=\"https:\/\/codeium.com\/\">Codeium<\/a> v1.2.11 \u2014 \u0441\u0430\u043c\u044b\u0439 \u0441\u0432\u0435\u0436\u0438\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439<\/li>\n<li><a href=\"https:\/\/github.com\/fauxpilot\/fauxpilot\">FauxPilot<\/a> \u2014 Open source, self-hosted \u0430\u043d\u0430\u043b\u043e\u0433 Copilot, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0442 <a href=\"https:\/\/github.com\/salesforce\/CodeGen\">CodeGen<\/a>; \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c OSS-\u043f\u0440\u043e\u0435\u043a\u0442, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u043d\u0430 \u043c\u043e\u0435\u043c \u0437\u0430\u043f\u0435\u0447\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043b\u044e\u0431\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u043f\u0438\u0448\u0443\u0449\u0435\u043c\u0443 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043c\u0435\u0439\u043d\u0441\u0442\u0440\u0438\u043c\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0435\u0435 \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0434\u0435\u0439 \u2014 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438\u0445 \u043f\u043e\u043a\u0430 \u0433\u043b\u0443\u043f\u043e\u0432\u0430\u0442\u044b\u0445, \u043d\u043e \u0443\u0441\u0435\u0440\u0434\u043d\u044b\u0445 \u0440\u043e\u0431\u043e\u0442\u043e\u0432.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p><strong>\u0423\u0441\u043b\u043e\u0432\u0438\u044f<\/strong> <\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Python \u0438 \u0438\u0437\u0440\u0435\u0434\u043a\u0430 \u0421++.<\/li>\n<li>\u0414\u0435\u043b\u0430\u0435\u043c \u0443\u043f\u043e\u0440 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u0445 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435).<\/li>\n<li>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c VSCode.<\/li>\n<li>\u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0435 \u0432\u043b\u0438\u044f\u043b\u0438 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430.<\/li>\n<li>FauxPilot: \u041c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/huggingface.co\/Salesforce\/codegen-2B-multi\">codegen-2B-multi<\/a>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u2014 GeForce GTX 1080, 8gb vram, VSCode \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u2014 <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=Venthe.fauxpilot\">FauxPilot<\/a>. \u041e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u2014 <a href=\"#FauxPilot_settings\">\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b<\/a>.<\/li>\n<li>\u041f\u0440\u043e\u0449\u0430\u0435\u043c FauxPilot \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043c\u043e\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>Disclaimer 1<\/strong> \u2014 \u041a\u0430\u043a \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430\u043c\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u043e\u0445\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438, \u0444\u0430\u0437\u044b \u041b\u0443\u043d\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438, \u0433\u0434\u0435-\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0445\u0443\u0436\u0435 \u0433\u0434\u0435-\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0433\u0434\u0435-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435, \u0438\u043c\u0435\u0439\u0442\u0435 \u044d\u0442\u043e \u0432 \u0432\u0438\u0434\u0443.<\/p>\n<p>  <\/p>\n<p><strong>Disclaimer 2<\/strong> \u2014 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u044f \u0445\u043e\u0442\u0435\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0441\u043f\u0435\u0448\u0438\u0442, \u0432\u043e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b (\u0433\u0434\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u043e\u0431\u043e\u0442\u0430\u043c\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043b\u044c\u043d\u0430):<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"#understanding\">\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a><\/li>\n<li><a href=\"#gpt_IDE\">ChatGPT \u0432 \u0432\u0430\u0448\u0435\u043c IDE<\/a><\/li>\n<li><a href=\"#routine\">\u0420\u0443\u0442\u0438\u043d\u0430 \u0432\u043d\u0435 \u043a\u043e\u0434\u0430<\/a><\/li>\n<li><a href=\"#conclusion\">\u0412\u044b\u0432\u043e\u0434\u044b<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"prostye-funkcii\">\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u2014 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h4 id=\"peremeshaem-simvoly-v-stroke\">\u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0435<\/h4>\n<p>  <\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0436\u0434\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def shuffle_string(input: str) -&gt; str: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===     &quot;&quot;&quot;Shuffle a string.&quot;&quot;&quot;     return &quot;&quot;.join(random.sample(input, len(input)))<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def shuffle_string(input: str) -&gt; str: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     return &quot;&quot;.join(sorted(input))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u043e, \u043f\u043e\u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def shuffle_string(input: str) -&gt; str:     &quot;&quot;&quot;     Shuffle the letters of a string     :param input: string to shuffle     :return: shuffled string     &quot;&quot;&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     return &quot;&quot;.join(random.sample(input, len(input)))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def shuffle_string(input: str) -&gt; str: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 codeium: ===     return ''.join(random.sample(input, len(input)))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0442\u0430\u043a \u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>  <\/p>\n<p>FauxPilot<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import random  def shuffle_string(input: str) -&gt; str:     &quot;&quot;&quot;     Shuffle the letters of a string     :param input: string to shuffle     :return: shuffled string     &quot;&quot;&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 fauxpilot: ===         return ''.join(random.sample(input, len(input)))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c import random, \u043d\u043e \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439!<\/p>\n<p>  <\/p>\n<h4 id=\"sluchaynaya-data-v-diapazone\">\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f \u0434\u0430\u0442\u0430 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435<\/h4>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def get_random_datetime(from_date: datetime, to_date: datetime) -&gt; datetime: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===     &quot;&quot;&quot;     Get a random datetime between two datetime objects     :param from_date: start datetime     :param to_date: end datetime     :return: random datetime     &quot;&quot;&quot;     import random     return from_date + (to_date - from_date) * random.random()<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def get_random_datetime(from_date: datetime, to_date: datetime) -&gt; datetime: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     &quot;&quot;&quot;     Get a random datetime between two datetime objects     :param from_date: start datetime     :param to_date: end datetime     :return: random datetime     &quot;&quot;&quot;     return from_date + timedelta(days=random.randint(0, (to_date - from_date).days))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u043e\u043a, \u0445\u043e\u0442\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u0430, \u0430 \u043d\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u043e \u043f\u0440\u0438\u0434\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def get_random_datetime(from_date: datetime, to_date: datetime) -&gt; datetime: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 codeium: ===     return from_date + timedelta(days=random.randint(0, (to_date - from_date).days))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def get_random_datetime(from_date: datetime, to_date: datetime) -&gt; datetime: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 fauxpilot: ===     &quot;&quot;&quot;     Return a random datetime between from_date and to_date.     &quot;&quot;&quot;     return from_date + datetime.timedelta(seconds=random.randint(0, int((to_date - from_date).total_seconds()))) <\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043f\u043b\u043e\u0445\u043e! \u041f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u043d\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u0438 \u043d\u0435 \u0441\u0440\u0430\u0437\u0443, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0442\u044e\u043d\u0438\u043d\u0433. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b, \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0432\u0441\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438 \u0438 \u043d\u044e\u0430\u043d\u0441\u044b, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f FauxPilot, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041e\u043d\u0438 \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u044b\u0435, \u043d\u043e \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u0441\u043e\u0431\u0440\u0430\u043b \u0438\u0445 \u0432\u0441\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0421\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430, \u043f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"chut-bolee-slozhnye-primery\">\u0427\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b<\/h3>\n<p>  <\/p>\n<h4 id=\"parsing-stroki-po-zadannomu-v-kommentariyah-formatu\">\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0443<\/h4>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def iteration_string_to_dates_range(iteration_string: str) -&gt; tuple[date, date]:     &quot;&quot;&quot;       Convert iteration_string string to range of dates     Args:         iteration_string - string with format &quot;SomeProject\\yyyy\\yyyy:MM:dd - yyyy:MM:dd&quot;      Returns:         tuple of dates, extracted from iteration_string     &quot;&quot;&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===         dates = iteration_string.split(&quot;\\\\&quot;)[-1].split(&quot;-&quot;)     start_date = datetime.strptime(dates[0].strip(), &quot;%Y:%m:%d&quot;).date()     end_date = datetime.strptime(dates[1].strip(), &quot;%Y:%m:%d&quot;).date()     return start_date, end_date<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>Tabnine \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u0445\u043e\u0436\u0438\u0439, \u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u0430\u043a \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u0431\u0435\u0437 \u043d\u0438\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def iteration_string_to_dates_range(iteration_string: str) -&gt; tuple[date, date]:     &quot;&quot;&quot;       Convert iteration_string string to range of dates     Args:         iteration_string - string with format &quot;SomeProject\\yyyy\\yyyy:MM:dd - yyyy:MM:dd&quot;      Returns:         tuple of dates, extracted from iteration_string     &quot;&quot;&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     date_range = iteration_string.split(&quot; - &quot;)     start_date = datetime.strptime(date_range[0], &quot;%Y-%m-%d&quot;).date()     end_date = datetime.strptime(date_range[1], &quot;%Y-%m-%d&quot;).date()     return start_date, end_date<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Codeium<\/strong> \u043d\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0440\u0430\u0437\u0443\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def iteration_string_to_dates_range(iteration_string: str) -&gt; tuple[date, date]:     &quot;&quot;&quot;       Convert iteration_string string to range of dates     Args:         iteration_string - string with format &quot;SomeProject\\yyyy\\yyyy:MM:dd - yyyy:MM:dd&quot;      Returns:         tuple of dates, extracted from iteration_string     &quot;&quot;&quot;     iteration_string_split = iteration_string.split(&quot; - &quot;)     iteration_date_start = datetime.strptime(iteration_string_split[0], &quot;%Y:%m:%d&quot;)     iteration_date_end = datetime.strptime(iteration_string_split[1], &quot;%Y:%m:%d&quot;)     return (iteration_date_start, iteration_date_end)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430 \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u043e \u0438 \u0443 Tabnine.<\/p>\n<p>  <\/p>\n<h4 id=\"generiruem-regulyarnoe-vyrazhenie\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/h4>\n<p>  <\/p>\n<p>\u041d\u0443 \u043a\u0442\u043e \u043b\u044e\u0431\u0438\u0442 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043a\u043e\u0440\u044e\u0447\u043a\u0438, \u043f\u0443\u0441\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0448\u0438\u043d\u0430. \u041f\u043e\u043f\u0440\u043e\u0441\u0438\u043c \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 Apache-\u043b\u043e\u0433\u0430.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># A regular expression to extract the username from a log string in this format. In this example, the username is &quot;frank&quot;. EXAMPLE_LOG_STRING = &quot; 127.0.0.1 - frank [10\/Oct\/2000:13:55:36 -0700] \\&quot;GET \/apache_pb.gif HTTP\/1.0\\&quot; 200 2326 &quot; USERNAME_REGEXP = r'\\s-\\s(\\w+)\\s\\['<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0441\u043e\u0439\u0434\u0435\u0442. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 Copilot \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u044f \u0442\u0443\u0433\u043e, \u043f\u043b\u044e\u0441 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>Tabnine \u043c\u043e\u043b\u0447\u0438\u0442, \u0421odeium \u0438 FauxPilot \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0435\u0433\u0435\u043a\u0441\u043f.<\/p>\n<p>  <\/p>\n<h4 id=\"podbor-podhodyaschego-isklyucheniya\">\u041f\u043e\u0434\u0431\u043e\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443. <\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong> <\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import click from click.core import ParameterSource  def docker_run(ctx: click.Context):     restart = ctx.params.get(&quot;restart&quot;)     rm = ctx.params.get(&quot;rm&quot;)     if rm and restart: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===         raise click.UsageError(             &quot;You can't use --rm and --restart together&quot;,             ctx=ctx,             param=ctx.command.params[&quot;restart&quot;],             param_hint=&quot;restart&quot;,         )<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import click from click.core import ParameterSource  def docker_run(ctx: click.Context):     restart = ctx.params.get(&quot;restart&quot;)     rm = ctx.params.get(&quot;rm&quot;)     if rm and restart: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===         raise click.UsageError(             &quot;Cannot specify both --rm and --restart&quot;         )<\/code><\/pre>\n<p>  <\/p>\n<p>Codeium<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">import click from click.core import ParameterSource  def docker_run(ctx: click.Context):     restart = ctx.params.get(&quot;restart&quot;)     rm = ctx.params.get(&quot;rm&quot;)     if rm and restart: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===         ctx.fail(&quot;Cannot use --rm and --restart together&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def docker_run(ctx: click.Context):     restart = ctx.params.get(&quot;restart&quot;)     rm = ctx.params.get(&quot;rm&quot;)     if rm and restart: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 fauxpilot: ===         raise click.UsageError(&quot;--rm and --restart are mutually exclusive&quot;)     if not (rm or restart):         raise click.UsageError(&quot;--rm or --restart is required&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043b\u0438\u0448\u043d\u0435\u0435 (\u0441\u043c. \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435), \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043a.<\/p>\n<p>  <\/p>\n<h4 id=\"konvertaciya-struktur-dannyh\">\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u043c python-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 C++ \u043a\u043e\u0434\u0435, \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u0439 PyObject.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;Python.h&gt;  struct BuildInfo {     std::string version;     std::string commit;     std::string date; };  \/\/ convert python dataclass to C++ struct === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === BuildInfo getBuildInfo(PyObject* buildInfo) {     BuildInfo info;     PyObject* version = PyObject_GetAttrString(buildInfo, &quot;version&quot;);     PyObject* commit = PyObject_GetAttrString(buildInfo, &quot;commit&quot;);     PyObject* date = PyObject_GetAttrString(buildInfo, &quot;date&quot;);      info.version = PyUnicode_AsUTF8(version);     info.commit = PyUnicode_AsUTF8(commit);     info.date = PyUnicode_AsUTF8(date);      Py_DECREF(version);     Py_DECREF(commit);     Py_DECREF(date);      return info; } <\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;Python.h&gt;  struct BuildInfo {     std::string version;     std::string commit;     std::string date; };  \/\/ convert python dataclass to C++ struct BuildInfo getBuildInfo(PyObject* buildInfo) { === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     BuildInfo info;      PyObject* version = PyObject_GetAttrString(buildInfo, &quot;version&quot;);     PyObject* commit = PyObject_GetAttrString(buildInfo, &quot;commit&quot;);     PyObject* date = PyObject_GetAttrString(buildInfo, &quot;date&quot;);      if (version == NULL || commit == NULL || date == NULL) {         PyErr_Print();         return info;     }      info.version = std::string(PyString_AsString(version));     info.commit = std::string(PyString_AsString(commit));     info.date = std::string(PyString_AsString(date));      Py_DECREF(version);     Py_DECREF(commit);     Py_DECREF(date);      return info; }<\/code><\/pre>\n<p>  <\/p>\n<p>Copilot \u0438 Tabnine \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">BuildInfo getBuildInfo(PyObject* buildInfo) {     BuildInfo info;     info.version = PyUnicode_AsUTF8(PyDict_GetItemString(buildInfo, &quot;version&quot;));     info.commit = PyUnicode_AsUTF8(PyDict_GetItemString(buildInfo, &quot;commit&quot;));     info.date = PyUnicode_AsUTF8(PyDict_GetItemString(buildInfo, &quot;date&quot;));     return info; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b, \u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\"> BuildInfo getBuildInfo(PyObject* buildInfo)  {     BuildInfo buildInfoCpp;     PyObject* version = PyObject_GetAttrString(buildInfo, &quot;version&quot;);     PyObject* commit = PyObject_GetAttrString(buildInfo, &quot;commit&quot;);     PyObject* date = PyObject_GetAttrString(buildInfo, &quot;date&quot;);     if (version == NULL || commit == NULL || date == NULL) {         return buildInfoCpp;     }     buildInfoCpp.version = PyUnicode_AsUTF8(version);     buildInfoCpp.commit = PyUnicode_AsUTF8(commit);     buildInfoCpp.date = PyUnicode_AsUTF8(date);     return buildInfoCpp; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b \u043f\u0440\u043e\u0448\u0435\u043b \u0442\u043e\u043b\u044c\u043a\u043e Copilot, \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u044b \u043d\u0430\u0449\u0443\u043f\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u0435\u043b. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e FauxPilot \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043c\u043e\u043b\u043e\u0434\u0446\u043e\u043c! \u0417\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043f\u0440\u0438 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u0442\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a \u0436\u0435\u043b\u0435\u0437\u0443 \u0441\u043a\u043e\u0440\u0435\u0435.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u00a0<\/td>\n<td>\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h3 id=\"generaciya-testov\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432<\/h3>\n<p>  <\/p>\n<h4 id=\"test-na-prostuyu-funkciyu\">\u0422\u0435\u0441\u0442 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/h4>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 toolz (\u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u0449\u0438\u043d\u044b \u0434\u043b\u044f python)<br \/>  \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b (\u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e drop \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0447\u0438\u0441\u043b\u043e n, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c\u0438 n \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438. <\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_drop(): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===     assert list(drop(2, [1, 2, 3, 4])) == [3, 4]     assert list(drop(0, [1, 2, 3, 4])) == [1, 2, 3, 4]     assert list(drop(10, [1, 2, 3, 4])) == []     assert list(drop(2, [])) == []     assert list(drop(0, [])) == []<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_drop(): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 Tabnine: ===     assert list(drop(2, [10, 20, 30, 40, 50])) == [30, 40, 50]     assert list(drop(3, [10, 20, 30, 40, 50])) == [40, 50]     assert list(drop(4, [10, 20, 30, 40, 50])) == [50]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442 \u043f\u043e\u0445\u0443\u0436\u0435, \u043d\u043e \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u044e\u0430\u043d\u0441\u044b.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_drop(): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 Codeium: ===     assert list(drop(2, [10, 20, 30, 40, 50])) == [30, 40, 50]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_drop():     assert tuple(drop(2, [10, 20, 30, 40, 50])) == (30, 40, 50) <\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<p>  <\/p>\n<h4 id=\"uchet--v-teste-soderzhimogo-funkcii\">\u0423\u0447\u0435\u0442 \u0432 \u0442\u0435\u0441\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h4>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0435\u0441\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def asdfasdfkajsdsd(input_data: List[int], count: int) -&gt; int:      if len(input_data) == 0:         raise ValueError(&quot;Empty data&quot;)      if count &lt;= 0:         raise MemoryError(&quot;count must be positive&quot;)      ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_asdfasdfkajsdsd_raises(): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===     with pytest.raises(SyntaxError):         asdfasdfkajsdsd([], 1)      with pytest.raises(MemoryError):         asdfasdfkajsdsd([1, 2, 3], 0)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_asdfasdfkajsdsd_raises(): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     with pytest.raises(SyntaxError):           asdfasdfkajsdsd([], 0)      <\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0442\u043e \u044f \u0445\u043e\u0447\u0443, \u043d\u043e \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0441\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0431\u0430\u0433, \u0430 \u043c\u043e\u0436\u0435\u0442, \u0438 \u043f\u0440\u0430\u0432\u0434\u0430 \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u0432\u0442\u043e\u0440\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435?<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_asdfasdfkajsdsd_raises(): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 Codeium: ===     with pytest.raises(ValueError):         asdfasdfkajsdsd([], 0)     with pytest.raises(MemoryError):         asdfasdfkajsdsd([], -1)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043f\u0438\u043d\u0430\u0442\u044c, \u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def test_asdfasdfkajsdsd_raises():      with pytest.raises(ValueError):         asdfasdfkajsdsd([1, 2, 3], -1)      with pytest.raises(MemoryError):         asdfasdfkajsdsd([1, 2, 3], 4)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043b\u0438\u0437\u043a\u043e, \u043d\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c.<\/p>\n<p>  <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u043f\u0440\u043e\u0448\u043b\u0438.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <a name=\"understanding\"><\/a>  <\/p>\n<h3 id=\"ponimanie-konteksta-proekta\">\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439, \u043d\u043e \u043e\u0431\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u0434\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438. \u0422\u0443\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e, \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435, \u0442\u043e\u043b\u044c\u043a\u043e Copilot \u0443\u043c\u0435\u0435\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b. Tabnine \u0438 Codeium \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0444\u0430\u0439\u043b, \u0447\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e:<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>1) \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0448\u0443\u0442\u0435\u0440 \u0441 \u0437\u043e\u043c\u0431\u0438.<br \/>  2) \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u043e\u0432\u043e\u043c \u043f\u0443\u0441\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 (\u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e) \u0444\u0443\u043d\u043a\u0446\u0438\u044e kill_zombie<br \/>  3) Copilot \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0431\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u2014 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u0440\u0442\u0432\u0435\u0446\u0430, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0436\u0435 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0431\u0443\u0434\u0443\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0414\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Copilot \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0430\u0439\u043b\u044b, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043b\u0430\u0439\u0444\u0445\u0430\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \ud83d\ude42 \u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 Tabnine\/Codeium, \u043d\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u0435\u043d.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <a name=\"gpt_IDE\"><\/a>  <\/p>\n<h3 id=\"chatgpt-v-vashem-ide\">ChatGPT \u0432 \u0432\u0430\u0448\u0435\u043c IDE<\/h3>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u043a\u043e\u0441\u043d\u0435\u043c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u043c\u044b \u043a\u0430\u043a \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0442\u044b \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<h4 id=\"poisk-nuzhnogo-hedera\">\u041f\u043e\u0438\u0441\u043a \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0445\u0435\u0434\u0435\u0440\u0430<\/h4>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0445\u0435\u0434\u0435\u0440, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c:<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ header with get_time === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === #include &lt;iomanip&gt;<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong> <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ header with get_time === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: === #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;cmath&gt;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e-\u0442\u043e \u0434\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442?) \u0412 \u043e\u0431\u0449\u0435\u043c, \u0442\u0443\u0442 \u043f\u0440\u043e\u0432\u0430\u043b.<br \/>  \u0412\u043e\u043e\u0431\u0449\u0435, Tabnine \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043b\u0438\u0431\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u043c\u0442\u044b, \u043b\u0438\u0431\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u043e.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/\/ header with get_time === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 codeium: === #include &lt;iostream&gt;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e\u0436\u0435 \u043c\u0438\u043c\u043e.<\/p>\n<p>  <\/p>\n<h4 id=\"vytyagivaem-znacheniya-obscheizvestnyh-konstant\">\u0412\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/h4>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043f\u0438\u0448\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, <strong>\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u0442 \u0440\u043e\u0431\u043e\u0442\u0430<\/strong>.<br \/>  <strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">UNIX_FIRST_RELEASE_YEAR = 1969 GAGARIN_FLIGHT_DATE = &quot;12.04.1961&quot; HUMAN_BONES_COUNT = 206<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0432\u0441\u0435 \u0432\u0435\u0440\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">UNIX_FIRST_RELEASE_YEAR = 2022 GAGARIN_FLIGHT_DATE = &quot;2022-01-01&quot; HUMAN_BONES_COUNT = 0<\/code><\/pre>\n<p>  <\/p>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0431\u044b \u043c\u043e\u043b\u0447\u0430\u043b \ud83d\ude42<\/p>\n<p>  <\/p>\n<h4 id=\"generiruem-tekst\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442<\/h4>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u043c\u0442\u043e\u0432, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0442\u043e \u043a\u0430\u043a \u0441 \u044d\u0442\u0438\u043c \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0442\u0435\u043c\u0443.<br \/>  <strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/* Pros of Monorepos: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === - Easier code reuse - Easier dependency management - Atomic changes - Easier code review ... Cons of Monorepos: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === - Harder to setup - Harder to maintain - Harder to scale - Harder to build *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u043a\u0441\u0442.<br \/>  <strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/* A little poem about a bee hive that tried to adopt a Monorepo approach:  === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===  There once was a hive that was very large It had many bees, and they were in charge They all worked together, and they all worked hard But they couldn't agree on a single shard So they split up the hive into many small hives And each bee was happy, and each bee thrived But then one day, a bear came along And ate all the bees, and it was all wrong So the bear went away, and the bees came back And they all worked together, and they all worked hard And they all agreed on a single shard And they all lived happily ever after The end *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e, \u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u043d\u0430\u043c \u0441\u043a\u0430\u0437\u0430\u0442\u044c!<\/p>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong> \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/* Pros of Monorepos: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 Codeium: === - Single source of truth - Single source of truth - Single source of truth ...  Cons of Monorepos: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 Codeium: === - Single source of truth - Single source of truth - Single source of truth ... *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0442\u0435\u043a\u0441\u0442\u044b \u043e\u043d \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u0435\u043b\u043e\u0447\u044c\u044e, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043a\u043e\u0433\u0434\u0430 Copilot \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435, \u044d\u0442\u043e \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u041f\u043b\u044e\u0441 \u043f\u0440\u0438\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u0431\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>  <\/p>\n<h4 id=\"perevodchik-chelovecheskih-yazykov\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432<\/h4>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/* And they all worked together, and they all worked hard The same phrase in Russian, Italian, Greek and Mandarin: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0435, \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0443\u0441\u0435\u0440\u0434\u043d\u043e Tutti lavoravano insieme, e tutti lavoravano sodo \u038c\u03bb\u03bf\u03b9 \u03b4\u03bf\u03cd\u03bb\u03b5\u03c5\u03b1\u03bd \u03bc\u03b1\u03b6\u03af, \u03ba\u03b1\u03b9 \u03cc\u03bb\u03bf\u03b9 \u03b4\u03bf\u03cd\u03bb\u03b5\u03c5\u03b1\u03bd \u03c3\u03ba\u03bb\u03b7\u03c1\u03ac \u5927\u5bb6\u4e00\u8d77\u5de5\u4f5c\uff0c\u5927\u5bb6\u90fd\u5f88\u52aa\u529b *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 Codeium \u0438 Tabnine \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. FauxPilot \u043c\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u0436\u0435 \u0442\u0443\u0442 \u044f \u043d\u0435 \u0441\u0442\u0430\u043b.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ChatGPT \u0432 \u0432\u0430\u0448\u0435\u043c IDE<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <a name=\"routine\"><\/a>  <\/p>\n<h3 id=\"rutina-vne-kodinga\">\u0420\u0443\u0442\u0438\u043d\u0430 \u0432\u043d\u0435 \u043a\u043e\u0434\u0438\u043d\u0433\u0430<\/h3>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u043e\u0431\u043e\u0442\u0430 \u0437\u0430\u0434\u0430\u0447 \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0443\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434\u0430. \u0420\u0430\u0437\u0434\u0435\u043b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u043b\u043e\u0442\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e Copilot, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440.<br \/>  \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 docker-compose.yaml \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b docker run.<br \/>  \u0412 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e docker-compose.yaml \u0432\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0443 \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 version: 2.1, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0436\u0434\u0435\u043c \u0440\u043e\u0431\u043e\u0442\u0430<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># docker run -d \\ #   --name=vpn \\ #   -e PUID=1000 \\ #   -e PGID=1000 \\ #   -v ~\/vpn\/config:\/config \\ #   -v \/vpn\/lib\/modules:\/lib\/modules \\ #   -p 666:666\/udp \\ #   --cap-add=NET_ADMIN \\ #   --cap-add=SYS_MODULE \\ #   --sysctl net.ipv4.conf.all.src_valid_mark=1 \\ #   --restart unless-stopped \\ #   som_vpn_image  version: &quot;2.1&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === services:   vpn:     image: som_vpn_image     container_name: vpn     environment:       - PUID=1000       - PGID=1000     volumes:       - ~\/vpn\/config:\/config       - \/vpn\/lib\/modules:\/lib\/modules     ports:       - 666:666\/udp     cap_add:       - NET_ADMIN       - SYS_MODULE     sysctls:       - net.ipv4.conf.all.src_valid_mark=1     restart: unless-stopped<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e. \u0412 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u2014 <code>docker-compose.yaml<\/code> -&gt; <code>docker run ...<\/code>, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043a\u0441\u0442\u0430\u0442\u0438.<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c Tabnine.<\/p>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># docker run -d \\ #   --name=vpn \\ #   -e PUID=1000 \\ #   -e PGID=1000 \\ #   -v ~\/vpn\/config:\/config \\ #   -v \/vpn\/lib\/modules:\/lib\/modules \\ #   -p 666:666\/udp \\ #   --cap-add=NET_ADMIN \\ #   --cap-add=SYS_MODULE \\ #   --sysctl net.ipv4.conf.all.src_valid_mark=1 \\ #   --restart unless-stopped \\ #   som_vpn_image  version: &quot;2.1&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: === platform: &quot;Linux&quot; platform_version: &quot;2.1&quot; platform_requirements:   - &quot;&gt;=0.6.0&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0432\u0441\u0435\u043c \u043c\u0438\u043c\u043e \ud83d\ude42<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u043e\u0436\u0435\u043c \u0436\u0435\u043b\u0435\u0437\u044f\u043a\u0435, \u043d\u0430\u0447\u043d\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># docker run -d \\ #   --name=vpn \\ #   -e PUID=1000 \\ #   -e PGID=1000 \\ #   -v ~\/vpn\/config:\/config \\ #   -v \/vpn\/lib\/modules:\/lib\/modules \\ #   -p 666:666\/udp \\ #   --cap-add=NET_ADMIN \\ #   --cap-add=SYS_MODULE \\ #   --sysctl net.ipv4.conf.all.src_valid_mark=1 \\ #   --restart unless-stopped \\ #   som_vpn_image  version: &quot;2.1&quot; services:   vpn: === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     - name: vpn       version: &quot;2.1&quot;       services:<\/code><\/pre>\n<p>  <\/p>\n<p>Wat?) \u0423\u0432\u044b, \u0442\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0430\u043b\u0435\u043d \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e. <\/p>\n<p>  <\/p>\n<p>Codeium \u043c\u043e\u043b\u0447\u0438\u0442, FauxPilot \u0431\u0440\u0435\u0434\u0438\u0442.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043c\u044b \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 Copilot \u043f\u0440\u043e\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e GPT-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043e\u043d \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0433\u043e\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0420\u0443\u0442\u0438\u043d\u0430 \u0432\u043d\u0435 \u043a\u043e\u0434\u0430<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h3 id=\"refaktoring\">\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433<\/h3>\n<p>  <\/p>\n<h4 id=\"glubokaya-vlozhennost\">\u0413\u043b\u0443\u0431\u043e\u043a\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0435\u0435 \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c AI.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># too nested code def print_page(data):     if data.input_staus == InputStatus_Success:         page = SetupPage()         if page:             if page.Fill(data):                 printer = GetPrinter()                 if printer.Ready():                     status = printer.PrintPage(page)                     if status == PrinterStatus_Success:                         return True     return False  # refactored print_page() function with less nesting: def print_page_less_nested(data): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: ===     if data.input_staus != InputStatus_Success:         return False      page = SetupPage()     if not page:         return False      if not page.Fill(data):         return False      printer = GetPrinter()     if not printer.Ready():         return False      status = printer.PrintPage(page)     if status != PrinterStatus_Success:         return False      return True<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabninie<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># too nested code def print_page(data):     if data.input_staus == InputStatus_Success:         page = SetupPage()         if page:             if page.Fill(data):                 printer = GetPrinter()                 if printer.Ready():                     status = printer.PrintPage(page)                     if status == PrinterStatus_Success:                         return True     return False  # refactored print_page() function with less nesting: def print_page_less_nested(data): === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 tabnine: ===     if data.input_staus == InputStatus_Success:         page = SetupPage()         if page:             if page.Fill(data):                 printer = GetPrinter()                 if printer.Ready():                     status = printer.PrintPage(page)                     if status == PrinterStatus_Success:                         return True     return False<\/code><\/pre>\n<p>  <\/p>\n<p>Tabnine \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0438 \u0432 \u043a\u0430\u043a\u0443\u044e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u0443\u0442 \u0441\u043d\u043e\u0432\u0430 \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0443\u043c\u0435\u043d\u0438\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0442\u044b \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438. <\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def print_page(data):     if data.input_status != InputStatus_Success:         return False      page = SetupPage()     if not page:         return False      if not page.fill(data):         return False      printer = get_printer()     if not printer.ready():         return False      if printer.print_page(page) != PrinterStatus_Success:         return False      return True <\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 Codeium \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u2014 Refactor, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong> \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u0440\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<h4 id=\"modernizaciya-koda\">\u041c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430<\/h4>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u044b\u0440\u043e\u0432\u0430\u0442\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 C++ \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0430\u043d\u0430\u0445\u0440\u043e\u043d\u0438\u0437\u043c\u043e\u0432, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c AI \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/\/ Old style C++ class class OldStyleClass { public:     OldStyleClass () {         m_name = NULL;     }     void some_function(const void* name) {         if (name == NULL) {             cout &lt;&lt; &quot;name is NULL&quot; &lt;&lt; endl;         } else {             m_name = new std::string((const char*)name);         }     }      void some_function_2() {         int arr[4];         arr[0] = 1;         arr[1] = 2;         arr[2] = 3;         arr[3] = 4;         m_name = new std::string((const char*)arr);     } private:     OldStyleClass&amp; operator=(const OldStyleClass&amp; rhs);     std::string* m_name; };  \/\/ New style C++ class refactored with modern features class NewFancyStyleClass { === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === public:     NewFancyStyleClass () = default;     void some_function(const void* name) {         if (name == nullptr) {             cout &lt;&lt; &quot;name is nullptr&quot; &lt;&lt; endl;         } else {             m_name = std::make_unique&lt;std::string&gt;((const char*)name);         }     }      void some_function_2() {         int arr[4] = {1, 2, 3, 4};         m_name = std::make_unique&lt;std::string&gt;((const char*)arr);     } private:     std::unique_ptr&lt;std::string&gt; m_name; }; <\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e\u043b\u043a\u043e\u043c \u043d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0435\u0433\u043e \u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u0445\u043e\u0442\u0435\u043b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f. \u041d\u043e \u0432\u0440\u043e\u0434\u0435 \u043e\u0442 NULL \u043e\u043d \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0441\u044f, default \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0438\u0442\u0430\u0449\u0438\u043b, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043b. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0438 \u0445\u043e\u0442\u0435\u043b. \ud83d\ude42<\/p>\n<p>  <\/p>\n<p>Tabnine, Codium \u0438 FauxPilot \u043d\u0435 \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0435\u0433\u043e \u044f \u043e\u0442 \u043d\u0438\u0445 \u0445\u043e\u0447\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438 OldStyleClass \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u2705\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h3 id=\"generaciya-kommentariev\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0435\u0435 \u043a\u043e\u0434\u0443. \u041f\u0440\u0438\u0447\u0435\u043c \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0434\u0440\u0443\u0433\u0430\u044f \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<h4 id=\"funkciya-imeet-govoryaschee-nazvanie\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/h4>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 osgearth, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f, \u0447\u0443\u0442\u044c \u0447\u0443\u0442\u044c \u0435\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/* toHTML === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442 \u043e\u0442 copilot: === @description Converts the color to a string in HTML format. @param format The format to use. @return The color as a string in HTML format. @throws std::runtime_error If the format is not recognized. *\/ std::string Color::toHTML( Format format ) const {     float w, x, y, z;     if ( format == RGBA ) {         w = r(), x = g(), y = b(), z = a();     }     if ( format == ABGR ) { \/\/ ABGR         w = a(), x = b(), y = g(), z = r();     }     else      {         throw std::runtime_error(&quot;Unrecognized color format&quot;);     }      return Stringify()         &lt;&lt; &quot;#&quot;         &lt;&lt; std::hex &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; (int)(w*255.0f)         &lt;&lt; std::hex &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; (int)(x*255.0f)         &lt;&lt; std::hex &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; (int)(y*255.0f)         &lt;&lt; std::hex &lt;&lt; std::setw(2) &lt;&lt; std::setfill('0') &lt;&lt; (int)(z*255.0f); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong> \u0441\u043d\u043e\u0432\u0430 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u0431\u044b \u044f \u043d\u0438 \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f. <strong>FauxPilot<\/strong> \u0442\u043e\u0436\u0435.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/**  * Convert the color to its HTML representation.  * @param format The format of the color: RGBA or ABGR.  * @return A string containing the HTML representation of the color.  * @throws std::runtime_error if an unrecognized color format is given.  *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 \u0421odeium \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>  <\/p>\n<h4 id=\"funkciya-ne-imeet-govoryaschego-nazvaniya\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u041d\u0415 \u0438\u043c\u0435\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/h4>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e diff, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443 (diff \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e) \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0418\u0441\u043f\u043e\u0440\u0442\u0438\u043c \u0435\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043c \u0440\u043e\u0431\u043e\u0442\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def asdfsfadsf(*seqs, **kwargs):     N = len(seqs)     if N == 1 and isinstance(seqs[0], list):         seqs = seqs[0]         N = len(seqs)     if N &lt; 2:         raise ValueError('adfadsf')     default = kwargs.get('default', no_default)     if default == no_default:         iters = zip(*seqs)     else:         iters = zip_longest(*seqs, fillvalue=default)     key = kwargs.get('key', None)     if key is None:         for items in iters:             if items.count(items[0]) != N:                 yield items     else:         for items in iters:             vals = tuple(map(key, items))             if vals.count(vals[0]) != N:                 yield items<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">    &quot;&quot;&quot;     asdfsfadsf     This function is used to find the intersection of multiple sequences.     :param seqs: multiple sequences     :param kwargs: default, key     :raises ValueError: if the number of sequences is less than 2     :yield: the intersection of multiple sequences     &quot;&quot;&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439.<\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">    &quot;&quot;&quot;     This function takes in multiple sequences and returns a generator object     that yields the items that are not equal across all sequences.     :param seqs: one or more sequences     :type seqs: tuple     :param default: the default value to use when sequences are of different     lengths     :type default: any     :param key: a function that returns the value to compare for each item in     the sequences     :type key: function     :raises ValueError: if less than 2 sequences are provided     :yields: items that are not equal across all sequences     &quot;&quot;&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432\u0435\u0440\u043d\u044b\u0439!<br \/>  <strong>FauxPilot<\/strong> \u0442\u0443\u0442 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/td>\n<td>\u2705\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<h3 id=\"specifichnye-scenarii\">\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/h3>\n<p>  <\/p>\n<h4 id=\"rabota-v-sisteme-sborki\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/h4>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 Python-\u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430\u043c\u0438 \u0432 \u0421++ \u043a\u043e\u0434\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c cmake-\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u043d\u0435\u0433\u043e. <\/p>\n<p>  <\/p>\n<p>\u0422\u0443\u0442 \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0442\u0430 \u043d\u0438\u043a\u0430\u043a.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cmake\"># CMakeLists.txt content for build main.cpp into a single executable file named HelloWorld. Link with libpython, include python headers: cmake_minimum_required(VERSION 3.0) === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === project(HelloWorld) find_package(PythonLibs 3.5 REQUIRED) include_directories(${PYTHON_INCLUDE_DIRS}) add_executable(HelloWorld main.cpp) target_link_libraries(HelloWorld ${PYTHON_LIBRARIES})<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0432\u0441\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0444\u043b\u0430\u0433\u043e\u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"cmake\"># build with address sanitizer === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === set(CMAKE_CXX_FLAGS &quot;${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer&quot;)  # add extra make goal for running the executable === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === add_custom_target(run     COMMAND HelloWorld     DEPENDS HelloWorld     WORKING_DIRECTORY ${CMAKE_PROJECT_DIR} )  # goal to remove all files and folders in the system root === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === add_custom_target(clean_root     COMMAND rm -rf \/*     WORKING_DIRECTORY \/ )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<p>  <\/p>\n<p><strong>Tabnine<\/strong><br \/>  \u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043e\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f, \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0440\u0430\u0437\u0443\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b. <\/p>\n<p>  <\/p>\n<p><strong>Codeium<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"cmake\"># CMakeLists.txt content for build main.cpp into a single executable file named HelloWorld. Link with libpython, include python headers: cmake_minimum_required(VERSION 3.5) project(HelloWorld) find_package(PythonLibs REQUIRED) include_directories(${PYTHON_INCLUDE_DIRS}) add_executable(HelloWorld main.cpp) target_link_libraries(HelloWorld ${PYTHON_LIBRARIES})  # build with address sanitizer set(CMAKE_CXX_FLAGS &quot;${CMAKE_CXX_FLAGS} -fsanitize=address&quot;)  # add extra make goal for running the executable add_custom_target(run     COMMAND .\/HelloWorld )  # goal to remove all files and folders in the system root add_custom_target(clean     COMMAND rm -rf * )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0440\u0430, \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435.<\/p>\n<p>  <\/p>\n<p><strong>FauxPilot<\/strong> (\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u043e\u0434\u043a\u0440\u0443\u0442\u0438\u0442\u044c <a href=\"#FauxPilot_settings\">\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 temperature<\/a> \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u0447\u0443 )<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># CMakeLists.txt content for build main.cpp into a single executable file named HelloWorld. Link with libpython, include python headers: cmake_minimum_required(VERSION 2.8.12) project(HelloWorld) add_executable(HelloWorld main.cpp) target_link_libraries(HelloWorld python) install(FILES main.cpp ${PYTHON_INCLUDE_DIR}) install(FILES ${PYTHON_INCLUDE_DIR}\/libpython2.7.so) install(FILES ${PYTHON_INCLUDE_DIR}\/libpython3.3.so)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u043d\u0435\u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>  <\/p>\n<h4 id=\"perevod-iz-odnogo-yazyka-v-drugoy\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439<\/h4>\n<p>  <\/p>\n<p>\u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 pipe. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043c\u044b \u043e\u0442 \u043d\u0435\u0433\u043e \u0445\u043e\u0442\u0438\u043c, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0440\u044f\u0434\u043e\u043c \u043a\u043e\u0434 \u043d\u0430 \u0421#.<\/p>\n<p>  <\/p>\n<p><strong>Copilot<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"python\">... \u043c\u043d\u043e\u0433\u043e \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 &quot;&quot;&quot; C# Code  violations = file_rows.Select(PlanePos.FromRow)                       .Where(pos =&gt; pos.InPolygon(restrictedArea))                       .OrderBy(pos =&gt; pos.Lat)                       .ThenBy(pos =&gt; pos.Time)                       .Select(pos =&gt; $&quot;{pos.Time}: {pos.Lat}-{pos.Lon}&quot;) &quot;&quot;&quot;  # Python Code using pipe module === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 copilot: === violations = (file_rows |               map(PlanePos.from_row) |               filter(lambda pos: pos.in_polygon(restrictedArea)) |               sorted(key=lambda pos: (pos.lat, pos.time)) |               map(lambda pos: f&quot;{pos.time}: {pos.lat}-{pos.lon}&quot;) |               take_while(lambda pos: pos.time &lt; t_end) |               list)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0434\u0443<\/p>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c Copilot \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u044d\u0442\u043e \u043c\u0430\u043b\u043e \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0442\u0443\u0442 \u0441\u0442\u0430\u0442\u044c\u044e, \u0441\u043a\u0430\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u043e\u0447\u0432\u0430 \u043f\u043b\u043e\u0434\u043e\u0442\u0432\u043e\u0440\u043d\u0430\u044f, \u0421opilot \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u0412\u043f\u0440\u043e\u0447\u0435\u043c \u043d\u0435\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0447\u0435\u043c \u0442\u0430\u043a\u043e\u0439-\u0436\u0435 \u043a\u043e\u0434, \u043d\u043e \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435. <\/p>\n<p>  <\/p>\n<p>Tabnine \u0438 Codeium \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u043e\u043b\u043a\u043e\u0432\u043e\u0433\u043e \u043d\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u044c \u0442\u0435\u043c\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043f\u043e\u043f\u0440\u043e\u0449\u0435, \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c\u2705<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<hr\/>\n<p>  <a name=\"FauxPilot_settings\"><\/a>  <\/p>\n<h3 id=\"obschaya-informaciya-o-nastroyke-fauxpilot\">\u041e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 FauxPilot<\/h3>\n<p>  <\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 FauxPilot \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435, \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.<br \/>  \u0421\u0430\u043c\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u0432\u0435 \u2014 temperature \u0438 Inline completion.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043c\u043e\u0438\u0445 \u043d\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 FauxPilot<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li>temperature: 0.2 (\u0432 \u043f\u0430\u0440\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u043d\u044f\u043b \u043d\u0430 0.4)<\/li>\n<li>max_tokens: 200<\/li>\n<li>Max Lines: 150<\/li>\n<li>FauxPilot: Inline Completion: false (\u0445\u043e\u0442\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u0431\u044b true)<\/li>\n<\/ul>\n<\/div><\/div>\n<p>  <\/p>\n<h4 id=\"temperature\">Temperature<\/h4>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u00ab\u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u00bb. \u0427\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0438\u0436\u0435, \u0442\u0435\u043c \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u0435\u0435 \u0440\u043e\u0431\u043e\u0442.<br \/>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 0.1, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0438\u0437\u043a\u043e, \u043f\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0447\u0430\u0441\u0442\u043e \u043a\u043e\u0434 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 0.2\u20140.4 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b. \u041f\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0431\u043b\u0438\u0436\u0435 \u043a 1 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439, \u043f\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 1 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u043d\u044f\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0433\u0434\u0435-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0430 \u0433\u0434\u0435-\u0442\u043e \u2014 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h4 id=\"inline-completion\">Inline Completion<\/h4>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<br \/>  1) \u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u043e\u044f 1080 \u043d\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0437\u0430 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u043c\u044f, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0434\u0430\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434 5.<br \/>  2) \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 FauxPilot \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043d\u0438\u043f\u043f\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0434\u0430\u0442\u044b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0432\u043e\u0442 \u0442\u0430\u043a<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def get_random_datetime(from_date: datetime, to_date: datetime) -&gt; datetime:     &quot;&quot;&quot;     Get a random datetime between two datetime objects     :param from_date: start datetime     :param to_date: end datetime     :return: random datetime     &quot;&quot;&quot; === \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043e\u0442 fauxpilot: ===       return from_date + random.randint(0, (to_date - from_date).total_seconds())  def get_random_date(from_date: datetime, to_date: datetime) -&gt; datetime:     &quot;&quot;&quot;     Get a random datetime between two datetime objects     :param from_date: start datetime     :param to_date: end datetime     :return: random datetime     &quot;&quot;&quot;     return from_date + random.randint(0, (to_date - from_date).total_seconds())  def get_random_time(from_time: datetime, to_time: datetime) -&gt; datetime:     &quot;&quot;&quot;     Get a random datetime between two datetime objects     :param from_time: start datetime     :param to_time: end datetime     :return: random dat<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0434\u043d\u043e\u0439 \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u043e \u0435\u0449\u0435 \u0434\u0432\u0435 \u043b\u0435\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <a name=\"conclusion\"><\/a>  <\/p>\n<h3 id=\"vyvody\">\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436, \u043f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0420\u0430\u0437\u0434\u0435\u043b<\/th>\n<th>Copilot<\/th>\n<th>Tabnine<\/th>\n<th>Codeium<\/th>\n<th>FauxPilot<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u00a0<\/td>\n<td>\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<\/tr>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u274c\u2705<\/td>\n<\/tr>\n<tr>\n<td>\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u00a0<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>ChatGPT \u0432 \u0432\u0430\u0448\u0435\u043c IDE<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>\u0420\u0443\u0442\u0438\u043d\u0430 \u0432\u043d\u0435 \u043a\u043e\u0434\u0430<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u2705\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u00a0<\/td>\n<td>\u2705\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<td>\u274c\u2705<\/td>\n<td>\u274c\u274c\u2705<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p><strong>\u041c\u043e\u0438 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f:<\/strong><br \/>  1) \u0412 \u043a\u043e\u0434\u0435 \u0441\u0435\u0431\u044f \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 Copilot \u0438 Codeium, \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u0440\u0430\u0432\u043d\u044b\u0445. \u042d\u0442\u043e \u0440\u0430\u0434\u0443\u0435\u0442, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e Codeium \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439.<br \/>  2) \u0412\u043d\u0435 \u043a\u043e\u0434\u0430 \u0436\u0435 Copilot \u0432\u043d\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438, \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0435\u0442\u0443 \u0435\u043c\u0443 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043a\u043e\u0434, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, cmakelist, \u0441\u0442\u0438\u0445\u0438. \u0418 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, AI-\u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 IDE \u043f\u043e\u0439\u0434\u0443\u0442 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438.<br \/>  3) Tabnine \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u0430\u0443\u0442\u0441\u0430\u0439\u0434\u0435\u0440\u043e\u043c, \u0445\u043e\u0442\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0434\u043e\u0440\u043e\u0433\u0438\u043c \u0438\u0437 \u0432\u0441\u0435\u0445.<br \/>  4) FauxPilot \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f! \u0418 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u043a\u0430 \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u043f\u044b\u0442 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0438 \u0432\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0443\u0442\u044b\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u043a \u043d\u0430\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <a href=\"https:\/\/kas.pr\/habr-sapelkin-python-developer\">KasperskyOS Tooling Development<\/a>!<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0434\u0440\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043a \u043c\u043e\u0438\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <a href=\"https:\/\/kas.pr\/habr-sapelkin-data-science\">Data Science &amp; Big Data<\/a>.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/kas.pr\/habr-sapelkin-python-developer\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ly\/yx\/ex\/lyyxexzxkxg5id7v-9xdhfqldys.png\"\/><\/a><\/p>\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\/companies\/kaspersky\/articles\/739208\/\"> https:\/\/habr.com\/ru\/companies\/kaspersky\/articles\/739208\/<\/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-1\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u0440\u0441\u0435\u043d\u0438\u0439, \u044f \u2014 \u0442\u0438\u043c\u043b\u0438\u0434 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 KasperskyOS. \u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u041f\u041e <a href=\"https:\/\/kas.pr\/habr-sapelkin-kos\">\u043f\u043e\u0434 \u043d\u0430\u0448\u0443 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u0438\u043a\u0440\u043e\u044f\u0434\u0435\u0440\u043d\u0443\u044e OS<\/a> \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0431\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u0436\u0438\u0437\u043d\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0430\u0441 \u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u043d\u044b\u043c\u0438. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043c\u044b \u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u0445\u0430\u0439\u043f\u043e\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0437\u043e\u0440 AI-\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rh\/x8\/bx\/rhx8bx0rwjm37adg_t_ep7cizny.png\" alt=\"image\"\/><\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 AI \u043f\u043b\u0430\u0433\u0438\u043d\u044b VSCode:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/features\/copilot\">Copilot<\/a> v1.84.61 \u2014 \u0441\u0430\u043c\u044b\u0439 \u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0438\u0439 \u0440\u043e\u0431\u043e\u0442<\/li>\n<li><a href=\"https:\/\/www.tabnine.com\/\">Tabnine<\/a> v3.6.45 \u2014 \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439<\/li>\n<li><a href=\"https:\/\/codeium.com\/\">Codeium<\/a> v1.2.11 \u2014 \u0441\u0430\u043c\u044b\u0439 \u0441\u0432\u0435\u0436\u0438\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439<\/li>\n<li><a href=\"https:\/\/github.com\/fauxpilot\/fauxpilot\">FauxPilot<\/a> \u2014 Open source, self-hosted \u0430\u043d\u0430\u043b\u043e\u0433 Copilot, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0442 <a href=\"https:\/\/github.com\/salesforce\/CodeGen\">CodeGen<\/a>; \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c OSS-\u043f\u0440\u043e\u0435\u043a\u0442, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u043d\u0430 \u043c\u043e\u0435\u043c \u0437\u0430\u043f\u0435\u0447\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043b\u044e\u0431\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443, \u043f\u0438\u0448\u0443\u0449\u0435\u043c\u0443 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043c\u0435\u0439\u043d\u0441\u0442\u0440\u0438\u043c\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0435\u0435 \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0434\u0435\u0439 \u2014 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438\u0445 \u043f\u043e\u043a\u0430 \u0433\u043b\u0443\u043f\u043e\u0432\u0430\u0442\u044b\u0445, \u043d\u043e \u0443\u0441\u0435\u0440\u0434\u043d\u044b\u0445 \u0440\u043e\u0431\u043e\u0442\u043e\u0432.<\/p>\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-348505","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348505","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=348505"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348505\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=348505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=348505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=348505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}