{"id":483158,"date":"2026-06-10T11:39:59","date_gmt":"2026-06-10T11:39:59","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483158"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483158","title":{"rendered":"10 \u0434\u043d\u0435\u0439 \u0441\u043f\u0443\u0441\u0442\u044f: \u043a\u0430\u043a \u043c\u043e\u0439 \u0431\u043e\u0442 \u0434\u0432\u0430\u0436\u0434\u044b \u0443\u043c\u0438\u0440\u0430\u043b \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043d\u0435 \u0432\u0440\u0430\u043b\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>10 \u0434\u043d\u0435\u0439 \u0441\u043f\u0443\u0441\u0442\u044f: \u043a\u0430\u043a \u043c\u043e\u0439 \u0431\u043e\u0442 \u0434\u0432\u0430\u0436\u0434\u044b \u0443\u043c\u0438\u0440\u0430\u043b \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043d\u0435 \u0432\u0440\u0430\u043b\u0430<\/h2>\n<blockquote>\n<p>TL;DR \u2014 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/1042690\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430<\/a> \u043f\u0440\u043e <a href=\"https:\/\/t.me\/futur_e_news_bot?start=habr2\" rel=\"noopener noreferrer nofollow\">@futur_e_news_bot<\/a> (\u0434\u0432\u0443\u044f\u0437\u044b\u0447\u043d\u0430\u044f \u043b\u0435\u043d\u0442\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 sqlite-vec \u0437\u0430 ~$5\/\u043c\u0435\u0441). \u0417\u0430 10 \u0434\u043d\u0435\u0439 \u0432 \u043f\u0440\u043e\u0434\u0435: <strong>\u0434\u0432\u0430 \u0442\u0438\u0445\u0438\u0445 \u043c\u043d\u043e\u0433\u043e\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u043e\u044f<\/strong> (\u0431\u043e\u0442 \u043f\u043e\u043b\u043b\u0438\u043b Telegram \u0438 \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0436\u0438\u0432\u044b\u043c, \u043d\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0432\u043e\u0441\u0442\u0438), <strong>\u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u0440\u0430\u0432\u0438\u043b \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a 106 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u0430\u043c\u0438<\/strong>, \u0438 <strong>\u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0440\u0435\u0430\u043a\u0446\u0438\u0439 78 \u044e\u0437\u0435\u0440\u043e\u0432<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432. \u041f\u043b\u044e\u0441 \u2014 \u044f <strong>\u043e\u0442\u043a\u0440\u044b\u043b \u043a\u043e\u0434 (MIT)<\/strong>. \u041f\u043e\u0441\u0442 \u043f\u0440\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 data-driven \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0433\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438 SRE, \u043d\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u044b \u0438 \u043b\u043e\u0433\u0438.<\/p>\n<\/blockquote>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u044f \u0441\u043e\u0431\u0440\u0430\u043b Telegram-\u0431\u043e\u0442\u0430 \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0435\u043d\u0442\u043e\u0439 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439: \u0434\u0435\u0434\u0443\u043f \u0447\u0435\u0440\u0435\u0437 sqlite-vec, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 LLM, \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb, \u043e\u0434\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0430 Fly.io. \u041f\u043e\u0441\u0442 \u043d\u0430 Habr \u043f\u0440\u0438\u0432\u0451\u043b \u043f\u0435\u0440\u0432\u044b\u0445 \u0436\u0438\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u0438 \u0442\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041d\u0435 \u043a\u043e\u0434. <strong>\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f.<\/strong><\/p>\n<hr\/>\n<h3>\u0413\u043b\u0430\u0432\u0430 1. \u0411\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043b\u0438\u0442, \u043d\u043e \u043c\u0451\u0440\u0442\u0432<\/h3>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u0430\u0433\u043e\u0432 \u0432 \u0431\u043e\u0442\u0435-\u0432\u043e\u0440\u043a\u0435\u0440\u0435: \u043e\u043d <strong>\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u044b\u043c<\/strong>. Telegram-\u0431\u043e\u0442 \u043d\u0430 long-polling \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, <code>\/start<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0410 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043b\u043e\u043c \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439. \u042f \u043b\u043e\u0432\u0438\u043b \u044d\u0442\u043e <strong>\u0434\u0432\u0430\u0436\u0434\u044b<\/strong> \u0437\u0430 \u044d\u0442\u0438 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u043d\u0435\u0434\u0435\u043b\u0438, \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.<\/p>\n<h4>OOM \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 crash loop \u043d\u0430 \u043f\u044f\u0442\u044c \u0434\u043d\u0435\u0439<\/h4>\n<p>\u0411\u043e\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 512 \u041c\u0411. \u042d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u043b\u043e\u2026 \u043f\u043e\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u043b \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u043b\u0435\u043d\u0438\u0432\u043e \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f ONNX-\u043c\u043e\u0434\u0435\u043b\u044c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 (<code>fastembed<\/code>). \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0443\u0448\u0438\u0442 RSS \u0434\u043e ~400 \u041c\u0411, \u0438 \u043d\u0430 512 \u041c\u0411 \u044f\u0434\u0440\u043e \u0443\u0431\u0438\u0432\u0430\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 <strong>\u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438<\/strong>:<\/p>\n<pre><code>Out of memory: Killed process 644 (python) ... anon-rss:406396kBProcess appears to have been OOM killed!reboot: Restarting system<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u0435\u0442\u043b\u044f: Fly \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0442 \u043c\u0430\u0448\u0438\u043d\u0443 \u2192 \u0431\u043e\u0442 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u2192 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u043b\u043b\u0438\u0442\u044c (\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u044b\u043c!) \u2192 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2192 OOM \u2192 \u0440\u0435\u0441\u0442\u0430\u0440\u0442. \u041c\u0435\u0436\u0434\u0443 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430\u043c\u0438 <code>_collect_sources<\/code> \u0443\u0441\u043f\u0435\u0432\u0430\u043b \u0437\u0430\u0444\u0435\u0442\u0447\u0438\u0442\u044c RSS, \u0438 <strong>raw-\u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043a\u043e\u043f\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0442\u043d\u044f\u043c\u0438<\/strong>, \u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 <code>Story<\/code>.<\/p>\n<p>\u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e <strong>\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u043f\u0440\u0438\u0448\u0451\u043b \u043f\u0443\u0441\u0442\u044b\u043c<\/strong>. \u041f\u043e\u043b\u0435\u0437 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435 \u0431\u044b\u043b\u0430 <strong>\u043f\u044f\u0442\u0438\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438<\/strong>. \u041f\u044f\u0442\u044c \u0434\u043d\u0435\u0439 \u0431\u043e\u0442 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u00bb \u0438 \u043c\u043e\u043b\u0447\u0430\u043b.<\/p>\n<p>\u0421\u0432\u043e\u043f \u0432 <code>fly.toml<\/code> (<code>swap_size_mb = 512<\/code>) \u043d\u0430 Fly \u0442\u0430\u043a \u0438 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u2014 <code>SwapTotal: 0<\/code>. \u0424\u0438\u043a\u0441 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439: 1 \u0413\u0411, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u043b\u044b\u0432\u0430 \u0441 Habr \u2014 2 \u0413\u0411.<\/p>\n<p><strong>\u0418 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e \u0447\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0441 \u0446\u0435\u043d\u043e\u0439.<\/strong> \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043f\u0438\u0441\u0430\u043b \u00ab<img decoding=\"async\" class=\"formula inline\" source=\"5\/\u043c\u0435\u0441\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0444\u0438\u043a\u0441\u0430 OOM \u0438 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u044d\u0442\u043e **2 \u0413\u0411 + 2 vCPU \u2248 $15\/\u043c\u0435\u0441**. \u0425\u043e\u0431\u0431\u0438-\u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043d\u0430 512 \u041c\u0411 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0442\u043e\u0438\u0442 ~\" alt=\"5\/\u043c\u0435\u0441\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0444\u0438\u043a\u0441\u0430 OOM \u0438 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u044d\u0442\u043e **2 \u0413\u0411 + 2 vCPU \u2248 $15\/\u043c\u0435\u0441**. \u0425\u043e\u0431\u0431\u0438-\u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043d\u0430 512 \u041c\u0411 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0442\u043e\u0438\u0442 ~\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/55\/554\/554a734a729443f0b675085750754619.svg\" width=\"1008\" height=\"16\" data-width=\"126.35\" data-height=\"2.262\" data-vertical-align=\"-0.566\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/55\/554\/554a734a729443f0b675085750754619.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/55\/554\/554a734a729443f0b675085750754619.svg 781w\" loading=\"lazy\" decode=\"async\"\/>5, \u043d\u043e \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u00ab\u043f\u043e\u0434 \u0436\u0438\u0432\u044b\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c\u00bb \u2014 \u0442\u0440\u0438 \u0447\u0430\u0448\u043a\u0438 \u043a\u043e\u0444\u0435, \u0430 \u043d\u0435 \u043e\u0434\u043d\u0430.<\/p>\n<h4>feedparser \u0431\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u0438\u043b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043d\u044f<\/h4>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u044b\u043b \u0445\u0438\u0442\u0440\u0435\u0435 \u0438 \u043d\u0435 \u0438\u043c\u0435\u043b \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u043a\u043e\u0434\u0435 \u0441\u0431\u043e\u0440\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b \u043d\u0435\u0432\u0438\u043d\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432:<\/p>\n<pre><code class=\"python\">feed = feedparser.parse(source.url)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>feedparser.parse(url)<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 <strong>\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430<\/strong>. \u041e\u0434\u0438\u043d \u043c\u0451\u0440\u0442\u0432\u044b\u0439\/\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 RSS-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a (\u0438\u043b\u0438 \u0437\u0430\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0432\u0448\u0438\u0439 self-hosted RSSHub) \u2014 \u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 <strong>\u0432\u0438\u0441\u043d\u0435\u0442 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430<\/strong>. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0434\u0436\u043e\u0431\u044b \u0441\u0442\u043e\u044f\u043b <code>max_instances=1<\/code>, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e <strong>\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f<\/strong>:<\/p>\n<pre><code>WARNING apscheduler: Execution of job \"run_pipeline\" skipped:                     maximum number of running instances reached (1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u0430\u0441\u044c \u0432 \u043b\u043e\u0433\u0430\u0445 <strong>\u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043d\u044f<\/strong>. \u0411\u043e\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0424\u0438\u043a\u0441 \u2014 \u0434\u0432\u0430 \u0441\u043b\u043e\u044f. \u041f\u0435\u0440\u0432\u044b\u0439: \u0444\u0435\u0442\u0447\u0438\u043c \u0447\u0435\u0440\u0435\u0437 <code>httpx<\/code> \u0441 \u0436\u0451\u0441\u0442\u043a\u0438\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c, \u0430 <code>feedparser<\/code> \u043a\u043e\u0440\u043c\u0438\u043c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 (\u043e\u043d \u0442\u043e\u0433\u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0441\u0438\u0442, \u0431\u0435\u0437 \u0441\u0435\u0442\u0438):<\/p>\n<pre><code class=\"python\">async def _download(url: str) -&gt; bytes:    async with httpx.AsyncClient(timeout=20.0, follow_redirects=True) as client:        resp = await client.get(url)        resp.raise_for_status()        return resp.content# \u0432 fetch():content = await _download(source.url)feed = await asyncio.to_thread(feedparser.parse, content)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439 \u2014 \u043f\u043e\u044f\u0441 \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u043e\u0434\u0442\u044f\u0436\u0435\u043a: \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u043e\u043d \u0432 \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0438\u0441\u0448\u0438\u0439 \u043f\u0440\u043e\u0433\u043e\u043d <strong>\u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u043c\u043e\u0433<\/strong> \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0434\u043e\u043b\u044c\u0448\u0435 10 \u043c\u0438\u043d\u0443\u0442:<\/p>\n<pre><code class=\"python\">async def run_pipeline_guarded() -&gt; None:    try:        await asyncio.wait_for(run_pipeline(), timeout=600)    except asyncio.TimeoutError:        logger.error(\"run_pipeline exceeded 600s and was cancelled (stuck fetch?)\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0423\u0440\u043e\u043a: \u0432\u043e\u0440\u043a\u0435\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f<\/h4>\n<p>\u041e\u0431\u0449\u0430\u044f \u043d\u0438\u0442\u044c \u0443 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e\u0435\u0432: <strong>\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043b\u0438\u0442, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0434\u043e\u0440\u043e\u0432\u044b\u043c<\/strong>, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u0451\u0440\u0442\u0432. \u0423 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0443\u043f\u0430\u043b \u0431\u044b \u0445\u0435\u043b\u0441\u0447\u0435\u043a. \u0423 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0445\u0435\u043b\u0441\u0447\u0435\u043a\u0430 \u043d\u0435\u0442.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b <strong>watchdog<\/strong> \u2014 \u0434\u0436\u043e\u0431\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437 \u0432 30 \u043c\u0438\u043d\u0443\u0442 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u043f\u0438\u0448\u0435\u0442 \u043c\u043d\u0435 \u0432 \u043b\u0438\u0447\u043a\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435:<\/p>\n<pre><code class=\"python\">async def check_pipeline_health(bot) -&gt; None:    age_h, pending = await _story_age_hours()    stale = age_h is None or age_h &gt;= 3.0    if stale and not _alerted:        # edge-triggered, \u043d\u0435 \u0441\u043f\u0430\u043c\u0438\u0442        await _notify_admins(bot, f\"\ud83d\udd34 \u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043c\u043e\u043b\u0447\u0438\u0442: \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c {age_h:.1f}\u0447 \u043d\u0430\u0437\u0430\u0434\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043b\u044e\u0441 <strong>\u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0431\u044d\u043a\u0430\u043f SQLite<\/strong> (\u043e\u043d\u043b\u0430\u0439\u043d-\u0431\u044d\u043a\u0430\u043f \u0447\u0435\u0440\u0435\u0437 <code>sqlite3<\/code>-API, \u0440\u043e\u0442\u0430\u0446\u0438\u044f 7 \u0434\u043d\u0435\u0439) \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0443 \u043c\u0435\u043d\u044f <strong>\u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438<\/strong>. \u041e\u0431\u0430 \u0444\u0438\u043a\u0441\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0439\u043c\u0430\u043b\u0438 \u0431\u044b \u043e\u0431\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u044b, \u0430 \u043d\u0435 \u0437\u0430 \u0434\u043d\u0438.<\/p>\n<hr\/>\n<h3>\u0413\u043b\u0430\u0432\u0430 2. \u0427\u0442\u043e\u0431\u044b \u0447\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u0435\u0451 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u043f\u043e\u0448\u0451\u043b \u0436\u0438\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a, \u044f \u0443\u043f\u0435\u0440\u0441\u044f \u0432 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435: <strong>\u0430 \u043b\u0435\u043d\u0442\u0430-\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f?<\/strong> \u0413\u043b\u0430\u0437\u0430\u043c\u0438 \u2014 \u0432\u0440\u043e\u0434\u0435 \u0434\u0430. \u041d\u043e \u00ab\u0432\u0440\u043e\u0434\u0435\u00bb \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0430.<\/p>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u00ab\ud83d\udcca \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430\u00bb \u0432 \u0431\u043e\u0442\u0435 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 <code><strong>.md<\/strong><\/code><strong>-\u0444\u0430\u0439\u043b \u0441 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u043c \u043e\u0442\u0447\u0451\u0442\u043e\u043c<\/strong>: \u0432\u043e\u0440\u043e\u043d\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438, DAU\/WAU, \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442, \u0442\u043e\u043f-\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u2014 \u0441 ASCII-\u0431\u0430\u0440\u0430\u043c\u0438 \u0438 <code>mermaid<\/code>-\u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438 (\u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0432 GitHub\/Obsidian). \u041f\u043e\u0447\u0435\u043c\u0443 \u0444\u0430\u0439\u043b, \u0430 \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: \u0435\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a\u0435, \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 \u043f\u0440\u043e\u0448\u043b\u044b\u043c.<\/p>\n<p>\u0426\u0438\u0444\u0440\u044b \u0447\u0435\u0440\u0435\u0437 10 \u0434\u043d\u0435\u0439 (78 \u044e\u0437\u0435\u0440\u043e\u0432 \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439, \u043d\u043e \u0442\u0440\u0435\u043d\u0434\u044b \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f (\u0445\u043e\u0442\u044c \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>87%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u043b\u0443\u0431\u0438\u043d\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>~18<\/strong> \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 (\u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u0435\u043d\u044c)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>~29%<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">WAU \/ \u0432\u0441\u0435\u0433\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>63 \/ 78<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0414\u043b\u044f \u0445\u043e\u043b\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430 \u2014 \u0436\u0438\u0432\u043e. \u041d\u043e \u0431\u044b\u043b \u043e\u0434\u0438\u043d \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u044f\u043c\u043e \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u043b\u0441\u044f: <strong>\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043b\u0430\u0439\u043a\u043e\u0432 \u043a \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u0430\u043c \u0434\u0435\u0440\u0436\u0430\u043b\u043e\u0441\u044c ~50\/50.<\/strong> \u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043e\u0446\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442\u0441\u044f. \u0412\u043e\u0442 \u0435\u0433\u043e \u0438 \u043f\u043e\u0448\u0451\u043b \u0447\u0438\u043d\u0438\u0442\u044c \u2014 \u0438 \u043d\u0430\u0440\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u043e\u043a\u0430.<\/p>\n<hr\/>\n<h3>\u0413\u043b\u0430\u0432\u0430 3. \u0410\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u0441\u0430\u043c\u0430 \u0441\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c (\u0430 \u044f \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b)<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u00ab\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435\u00bb: \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u043b \u0432\u0435\u0441\u0430 \u0432 \u0441\u043a\u043e\u0440\u0438\u043d\u0433\u0435, \u0441\u043d\u0438\u0437\u0438\u043b \u0434\u043e\u043b\u044e \u0441\u0435\u0440\u0435\u043d\u0434\u0438\u043f\u043d\u043e\u0441\u0442\u0438 (\u0430\u043d\u0442\u0438-\u0431\u0430\u0431\u043b\u0430) \u0441 35% \u0434\u043e 15%, \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0431\u0435\u0437 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043a\u0443\u0441\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0432 \u0442\u043e\u0447\u043a\u0443\u00bb, \u0431\u0435\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0439. \u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u0441\u043c\u043e\u0442\u0440\u044e \u043e\u0442\u0447\u0451\u0442 \u2014 <strong>50\/50 \u043a\u0430\u043a \u0441\u0442\u043e\u044f\u043b\u043e, \u0442\u0430\u043a \u0438 \u0441\u0442\u043e\u0438\u0442.<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0435 \u0442\u0443\u0434\u0430. \u041e\u0431\u0449\u0438\u0439 \u043b\u0430\u0439\u043a\/\u0434\u0438\u0437\u043b\u0430\u0439\u043a \u0437\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0443\u043f\u0430\u044f \u043b\u0438\u043d\u0437\u0430. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u043e\u0442\u0447\u0451\u0442 <strong>\u0440\u0430\u0437\u0440\u0435\u0437 \u043f\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c<\/strong> \u2014 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439:<\/p>\n<pre><code>RBC          70% \ud83d\ude48   Habr         +0.30 \ud83d\udc4dLenta.ru     61% \ud83d\ude48   TechCrunch   +0.33 \ud83d\udc4d                      Ars Technica +0.33 \ud83d\udc4d<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>Tech-\u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f (\u0430 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a\u043e \u043c\u043d\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441 Habr \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438) \u043b\u044e\u0431\u0438\u0442 tech-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438 \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442 \u0440\u0443\u0441\u0441\u043a\u0438\u0435 \u043e\u0431\u0449\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438.<\/strong> \u0410 Lenta + RBC \u0431\u044b\u043b\u0438 <strong>\u0434\u0432\u0443\u043c\u044f \u0441\u0430\u043c\u044b\u043c\u0438 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438<\/strong> \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u043b\u0435\u043d\u0442\u0430 \u043d\u0430 50% \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>\u0422\u044e\u043d\u0438\u043d\u0433 \u0432\u0435\u0441\u043e\u0432 \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u0433 \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c <strong>\u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435<\/strong>: \u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044f \u0431\u044b\u043b affinity \u043f\u043e <strong>\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/strong> \u0438 <strong>\u0442\u0435\u0433\u0430\u043c<\/strong>, \u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 <strong>\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430<\/strong>. \u0414\u043e\u0431\u0430\u0432\u0438\u043b \u2014 \u0440\u043e\u0432\u043d\u043e \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u0442\u043e\u043b\u044c\u043a\u043e per-source:<\/p>\n<pre><code class=\"python\"># \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0432\u0435\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432 -1..1if kind in (\"like\", \"open\"):    source_interests[sid] = min(1.0, source_interests.get(sid, 0.0) + 0.3)elif kind == \"dislike\":    source_interests[sid] = max(-1.0, source_interests.get(sid, 0.0) - 0.35)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0441\u043a\u043e\u0440\u0438\u043d\u0433 \u0447\u043b\u0435\u043d <code>+ 0.15 * source_affinity<\/code>. \u041f\u043b\u044e\u0441 <strong>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440<\/strong>: \u0434\u043b\u044f \u044e\u0437\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u043b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0431\u0435\u0440\u0451\u043c \u043a\u0440\u0430\u0443\u0434\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u2014 \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0436\u0435 \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u043b \u043c\u0435\u043d\u044c\u0448\u0435 \u0448\u0438\u0440\u043e\u043a\u043e-\u043d\u0435\u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432.<\/p>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u043e\u0431\u0435\u0434\u0430. \u0414\u0435\u043f\u043b\u043e\u044e, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043e\u0442\u0447\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043d\u044c \u2014 \u0438\u2026<\/p>\n<hr\/>\n<h3>\u0413\u043b\u0430\u0432\u0430 4. \u041c\u0435\u0442\u0440\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u0440\u0430\u0432\u0438\u043b \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a<\/h3>\n<p>\u2026\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c <strong>\u0440\u0443\u0445\u043d\u0443\u043b\u0430 \u0441 50% \u0434\u043e 30%<\/strong>. \u0414\u0438\u0437\u043b\u0430\u0439\u043a\u0438 \u0432\u0437\u043b\u0435\u0442\u0435\u043b\u0438 \u0441 62 \u0434\u043e 228. \u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u00ab\u0445\u0443\u0434\u0448\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432\u00bb \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c <strong>\u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435<\/strong>, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u0435: dev.to 91% \ud83d\ude48, Hacker News 80% \ud83d\ude48, \u0434\u0430\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0437\u0430\u0445\u0432\u0430\u043b\u0435\u043d\u043d\u044b\u0439 Habr.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u2014 \u00ab\u044f \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b \u0441\u0432\u043e\u0438\u043c source-affinity, \u043d\u0430\u0434\u043e \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u00bb. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0430\u043d\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435: <strong>\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong>.<\/p>\n<pre><code class=\"sql\">SELECT user_id, count(*) FROM interactions WHERE kind='dislike'GROUP BY user_id ORDER BY 2 DESC LIMIT 3;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code>  user 66  -&gt;  106 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u043e\u0432  user 73  -&gt;   31 \u0434\u0438\u0437\u043b\u0430\u0439\u043a  \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 -&gt; \u0435\u0434\u0438\u043d\u0438\u0446\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b 106 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u043e\u0432 \u0438\u0437 228 \u2014 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443.<\/strong> \u0412\u0434\u0432\u043e\u0451\u043c \u0441 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 60%. \u0415\u0441\u043b\u0438 \u0438\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a ~50%.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u0432 \u0447\u0451\u043c \u0431\u044b\u043b\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: <strong>\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430, \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0441\u044b\u0440\u044b\u0435 \u0440\u0435\u0430\u043a\u0446\u0438\u0438.<\/strong> \u041e\u0434\u0438\u043d \u043c\u0430\u0441\u0441-\u0434\u0438\u0437\u043b\u0430\u0439\u043a\u0435\u0440 \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043b \u0441\u0432\u043e\u0438 106 \ud83d\ude48 \u043f\u043e \u0432\u0441\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u2014 \u0438 <strong>\u043e\u0442\u0440\u0430\u0432\u0438\u043b \u043e\u0431\u0430<\/strong>: \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 30% \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 ~42%, \u0430 \u043f\u0440\u0438\u043e\u0440 \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0432\u0441\u044f\u043a\u0443\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u043e\u0441\u0442\u044c (\u0432\u0441\u0451 \u0441\u0442\u0430\u043b\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u00ab\u043d\u0430 80-100% \u043d\u0435\u043b\u044e\u0431\u0438\u043c\u044b\u043c\u00bb).<\/p>\n<p>\u0424\u0438\u043a\u0441 \u2014 \u0441\u0447\u0438\u0442\u0430\u0442\u044c <strong>\u043f\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u044e\u0437\u0435\u0440\u0430\u043c<\/strong>, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u00b11 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a:<\/p>\n<pre><code class=\"sql\">WITH per_user_source AS (  SELECT i.user_id, st.source_id,         SUM(i.kind='like') - SUM(i.kind='dislike') AS net  FROM interactions i JOIN stories st ON st.id = i.story_id  WHERE i.kind IN ('like','dislike')  GROUP BY i.user_id, st.source_id)SELECT source_id,       SUM(CASE WHEN net&gt;0 THEN 1 WHEN net&lt;0 THEN -1 ELSE 0 END) AS net_users,       COUNT(*) AS ratersFROM per_user_source GROUP BY source_id HAVING raters &gt;= 3;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0434\u0430 \u043f\u0440\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c. \u0420\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c <strong>\u043f\u043e \u044e\u0437\u0435\u0440\u0430\u043c \u2014 42%<\/strong> (\u0430 \u043d\u0435 30%). \u0418 \u043f\u0440\u0438\u043e\u0440 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043b <strong>\u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u044b\u043c<\/strong>:<\/p>\n<pre><code>\u0425\u041e\u0420\u041e\u0428\u041e:  TechCrunch +0.33 \u00b7 Ars Technica +0.33 \u00b7 Habr +0.11\u041f\u041b\u041e\u0425\u041e:   Habr Best -1.00 \u00b7 BBC -0.50 \u00b7 Hacker News -0.50 \u00b7 RBC\/Lenta -0.31<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0423\u0440\u043e\u043a \u0434\u043e\u0440\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0444\u0438\u0447\u0438: \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0441\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a.<\/strong> \u041d\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 78 \u044e\u0437\u0435\u0440\u043e\u0432 \u043e\u0434\u0438\u043d \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442 \u0441 \ud83d\ude48 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 46% \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0420\u043e\u0431\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043a \u0432\u044b\u0431\u0440\u043e\u0441\u0430\u043c \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0418 \u2014 <strong>\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u0443\u0439, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c<\/strong>: \u044f \u0431\u044b\u043b \u0432 \u0448\u0430\u0433\u0435 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0444\u0438\u0447\u0443 \u0438\u0437-\u0437\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f.<\/p>\n<hr\/>\n<h3>\u0413\u043b\u0430\u0432\u0430 5. \u041c\u0435\u043d\u044c\u0448\u0435, \u043d\u043e \u043b\u0443\u0447\u0448\u0435<\/h3>\n<p>42% \u2014 \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e (\u043d\u0435\u0442\u0442\u043e-\u044e\u0437\u0435\u0440 \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0435\u0434\u043e\u0432\u043e\u043b\u0435\u043d). \u0417\u0430\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u044b\u043b \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442:<\/p>\n<ul>\n<li>\n<p><code><strong>Habr Best<\/strong><\/code><strong> \u2014 \u22121.00<\/strong>: 4 \u0438\u0437 4 \u043e\u0446\u0435\u043d\u0438\u0432\u0448\u0438\u0445 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u043d\u0443\u043b\u0438. \u041e\u043d, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Habr.<\/p>\n<\/li>\n<li>\n<p><strong>dev.to, Lobsters<\/strong> \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u0444\u0430\u0439\u0440\u0445\u043e\u0443\u0437\u044b: \u043c\u043d\u043e\u0433\u043e, \u0448\u0443\u043c\u043d\u043e, \u043d\u0438\u0437\u043a\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b.<\/p>\n<\/li>\n<li>\n<p><strong>TechCrunch, Ars Technica, Habr<\/strong> \u2014 \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 tech, \u0432\u0441\u0435\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u0441\u044f \u0441\u0430\u043c: <strong>\u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u2014 \u0444\u0430\u0439\u0440\u0445\u043e\u0443\u0437\u0443.<\/strong> \u042f \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043b \u0442\u0440\u0438 \u0445\u0443\u0434\u0448\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (<code>Habr Best<\/code>, <code>dev.to<\/code>, <code>Lobsters<\/code>) \u2014 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435, \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u00abretired\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u0445 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043b\u0435\u0437\u0430\u043d\u044c\u044f \u0432 \u043f\u0440\u043e\u0434-\u0431\u0430\u0437\u0443:<\/p>\n<pre><code class=\"python\">RETIRED_SOURCE_URLS = [    \"https:\/\/habr.com\/ru\/rss\/best\/daily\/?fl=ru\",  # -1.00, \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 Habr    \"https:\/\/dev.to\/feed\",                         # \u0444\u0430\u0439\u0440\u0445\u043e\u0443\u0437    \"https:\/\/lobste.rs\/rss\",                        # \u043d\u0438\u0448\u0430]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0411\u043e\u043d\u0443\u0441\u043e\u043c \u044d\u0442\u043e \u0441\u0440\u0435\u0437\u0430\u043b\u043e \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u2014 \u0444\u0430\u0439\u0440\u0445\u043e\u0443\u0437\u044b \u0434\u0430\u0432\u0430\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u043e\u0442 ~1900 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439\/\u0434\u0435\u043d\u044c. \u041c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u2192 \u043c\u0435\u043d\u044c\u0448\u0435 \ud83d\ude48. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440 + \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0441\u0430 \u0434\u043e\u0431\u044c\u044e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u0430 \u043e\u0442\u0447\u0451\u0442 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043f\u043e\u043f\u043e\u043b\u0437\u043b\u0430 \u043b\u0438 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0432\u0435\u0440\u0445.<\/p>\n<hr\/>\n<h3>\u0427\u0442\u043e \u044f \u043f\u043e\u043d\u044f\u043b \u0437\u0430 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u043d\u0435\u0434\u0435\u043b\u0438<\/h3>\n<ul>\n<li>\n<p><strong>\u0412\u043e\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043b\u0438\u0442, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0451\u0440\u0442\u0432 \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0436\u0438\u0432\u044b\u043c.<\/strong> \u041c\u0435\u0440\u044f\u0439 \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430), \u0430 \u043d\u0435 \u00ab\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0436\u0438\u0432\u00bb. Watchdog \u043d\u0430 30 \u0441\u0442\u0440\u043e\u043a \u043e\u043a\u0443\u043f\u0438\u043b \u0431\u044b \u0441\u0435\u0431\u044f \u0434\u0432\u0430\u0436\u0434\u044b \u0437\u0430 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u043d\u0435\u0434\u0435\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u044e\u0431\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0431\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u2014 \u044d\u0442\u043e \u0431\u043e\u043c\u0431\u0430 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/strong> <code>feedparser.parse(url)<\/code>, \u044f \u0441\u043c\u043e\u0442\u0440\u044e \u043d\u0430 \u0442\u0435\u0431\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0439, \u043f\u043e\u0442\u043e\u043c \u0442\u044e\u043d\u0438.<\/strong> \u042f \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u043d\u0430 \u043a\u0440\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u0431\u0449\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443. \u0420\u0430\u0437\u0440\u0435\u0437 \u043f\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043f\u0440\u0438\u0447\u0438\u043d\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u0441\u0438\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c.<\/strong> \u0421\u0447\u0438\u0442\u0430\u0439 \u043f\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c, \u0430 \u043d\u0435 \u043f\u043e \u0441\u044b\u0440\u044b\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c. \u041d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u043e\u0434\u0438\u043d \u0432\u044b\u0431\u0440\u043e\u0441 = \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430 \u0432 \u0446\u0438\u0444\u0440\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u0430\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0441\u043a\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b.<\/strong> \u0410\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u0441\u0430\u043c\u0430 \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0432\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0435\u0441\u043b\u0438 \u0435\u0451 \u0441\u043b\u0443\u0448\u0430\u0442\u044c. \u041c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0433\u0430\u0434\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 RSS \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 \ud83d\ude48.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0435\u0441\u0442\u043d\u0430\u044f \u0446\u0435\u043d\u0430 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u2260 \u0446\u0435\u043d\u0430 \u043d\u0430 \u043b\u0435\u043d\u0434\u0438\u043d\u0433\u0435.<\/strong> <img decoding=\"async\" class=\"formula inline\" source=\"5 \u0438\u0434\u043b \u2192 ~\" alt=\"5 \u0438\u0434\u043b \u2192 ~\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d0\/d02\/d02a9cd9da3bf171fb96e2f9018a60fa.svg\" width=\"72\" height=\"16\" data-width=\"9.289\" data-height=\"2.149\" data-vertical-align=\"-0.452\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d0\/d02\/d02a9cd9da3bf171fb96e2f9018a60fa.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d0\/d02\/d02a9cd9da3bf171fb96e2f9018a60fa.svg 781w\" loading=\"lazy\" decode=\"async\"\/>15 \u0436\u0438\u0432\u043e\u0439. \u0412\u0441\u0451 \u0435\u0449\u0451 \u0434\u0451\u0448\u0435\u0432\u043e, \u043d\u043e \u0446\u0438\u0444\u0440\u0443 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c<\/h3>\n<p>\u0411\u043e\u0442 \u0436\u0438\u0432\u043e\u0439: <a href=\"https:\/\/t.me\/futur_e_news_bot?start=habr2\" rel=\"noopener noreferrer nofollow\"><strong>@futur_e_news_bot<\/strong><\/a> \u2014 <code>\/start<\/code>, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0448\u044c \u044f\u0437\u044b\u043a, \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0448\u044c \u043d\u0430 \u043f\u0430\u0440\u0443 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439, \u0438 \u043b\u0435\u043d\u0442\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438, \u043d\u0435\u0433\u0430\u0442\u0438\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0443\u043c\u0431\u043b\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u0430\u0431\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u2014 <strong>\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 42%<\/strong>, \u0438 \u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u0437\u0430 \u043d\u0435\u0439 \u0441\u043b\u0435\u0436\u0443 \u043f\u043e \u043e\u0442\u0447\u0451\u0442\u0443: source-affinity \u0438 \u043a\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0435\u0451 \u043f\u043e\u0434\u043d\u044f\u0442\u044c. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u043e \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u043b\u044c\u0435\u0442\u0441\u044f \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u043d\u0435\u0434\u0435\u043b\u044c, \u0432\u044b\u043b\u043e\u0436\u0443 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0443\u0436\u0435 \u0441 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u00ab\u0434\u043e\/\u043f\u043e\u0441\u043b\u0435\u00bb. \u0410 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445 \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u0441\u0443\u0436\u0443 sqlite-vec, \u0440\u043e\u0431\u0430\u0441\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0430\u0448 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u043e\u0436\u0435 \u043c\u0451\u0440\u0442\u0432 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u043b \u0432\u0430\u043c \u043e\u0431 \u044d\u0442\u043e\u043c.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1045969\/\">https:\/\/habr.com\/ru\/articles\/1045969\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>10 \u0434\u043d\u0435\u0439 \u0441\u043f\u0443\u0441\u0442\u044f: \u043a\u0430\u043a \u043c\u043e\u0439 \u0431\u043e\u0442 \u0434\u0432\u0430\u0436\u0434\u044b \u0443\u043c\u0438\u0440\u0430\u043b \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043d\u0435 \u0432\u0440\u0430\u043b\u0430TL;DR \u2014 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043f\u0440\u043e @futur_e_news_bot (\u0434\u0432\u0443\u044f\u0437\u044b\u0447\u043d\u0430\u044f \u043b\u0435\u043d\u0442\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 sqlite-vec \u0437\u0430 ~$5\/\u043c\u0435\u0441). \u0417\u0430 10 \u0434\u043d\u0435\u0439 \u0432 \u043f\u0440\u043e\u0434\u0435: \u0434\u0432\u0430 \u0442\u0438\u0445\u0438\u0445 \u043c\u043d\u043e\u0433\u043e\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u043e\u044f (\u0431\u043e\u0442 \u043f\u043e\u043b\u043b\u0438\u043b Telegram \u0438 \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0436\u0438\u0432\u044b\u043c, \u043d\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0432\u043e\u0441\u0442\u0438), \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u0440\u0430\u0432\u0438\u043b \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a 106 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u0430\u043c\u0438, \u0438 \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0440\u0435\u0430\u043a\u0446\u0438\u0439 78 \u044e\u0437\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432. \u041f\u043b\u044e\u0441 \u2014 \u044f \u043e\u0442\u043a\u0440\u044b\u043b \u043a\u043e\u0434 (MIT). \u041f\u043e\u0441\u0442 \u043f\u0440\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 data-driven \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0433\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438 SRE, \u043d\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u044b \u0438 \u043b\u043e\u0433\u0438.\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u044f \u0441\u043e\u0431\u0440\u0430\u043b Telegram-\u0431\u043e\u0442\u0430 \u0441 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0435\u043d\u0442\u043e\u0439 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439: \u0434\u0435\u0434\u0443\u043f \u0447\u0435\u0440\u0435\u0437 sqlite-vec, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 LLM, \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb, \u043e\u0434\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0430 Fly.io. \u041f\u043e\u0441\u0442 \u043d\u0430 Habr \u043f\u0440\u0438\u0432\u0451\u043b \u043f\u0435\u0440\u0432\u044b\u0445 \u0436\u0438\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u0438 \u0442\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041d\u0435 \u043a\u043e\u0434. \u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f.\u0413\u043b\u0430\u0432\u0430 1. \u0411\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043b\u0438\u0442, \u043d\u043e \u043c\u0451\u0440\u0442\u0432\u0421\u0430\u043c\u044b\u0439 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u0430\u0433\u043e\u0432 \u0432 \u0431\u043e\u0442\u0435-\u0432\u043e\u0440\u043a\u0435\u0440\u0435: \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u044b\u043c. Telegram-\u0431\u043e\u0442 \u043d\u0430 long-polling \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \/start \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0410 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043b\u043e\u043c \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439. \u042f \u043b\u043e\u0432\u0438\u043b \u044d\u0442\u043e \u0434\u0432\u0430\u0436\u0434\u044b \u0437\u0430 \u044d\u0442\u0438 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u043d\u0435\u0434\u0435\u043b\u0438, \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.OOM \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 crash loop \u043d\u0430 \u043f\u044f\u0442\u044c \u0434\u043d\u0435\u0439\u0411\u043e\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 512 \u041c\u0411. \u042d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u043b\u043e\u2026 \u043f\u043e\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u043b \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u043b\u0435\u043d\u0438\u0432\u043e \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f ONNX-\u043c\u043e\u0434\u0435\u043b\u044c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 (fastembed). \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0443\u0448\u0438\u0442 RSS \u0434\u043e ~400 \u041c\u0411, \u0438 \u043d\u0430 512 \u041c\u0411 \u044f\u0434\u0440\u043e \u0443\u0431\u0438\u0432\u0430\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438:Out of memory: Killed process 644 (python) &#8230; anon-rss:406396kBProcess appears to have been OOM killed!reboot: Restarting system\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u0435\u0442\u043b\u044f: Fly \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0442 \u043c\u0430\u0448\u0438\u043d\u0443 \u2192 \u0431\u043e\u0442 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u2192 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u043b\u043b\u0438\u0442\u044c (\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u044b\u043c!) \u2192 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2192 OOM \u2192 \u0440\u0435\u0441\u0442\u0430\u0440\u0442. \u041c\u0435\u0436\u0434\u0443 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430\u043c\u0438 _collect_sources \u0443\u0441\u043f\u0435\u0432\u0430\u043b \u0437\u0430\u0444\u0435\u0442\u0447\u0438\u0442\u044c RSS, \u0438 raw-\u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043a\u043e\u043f\u0438\u043b\u0438\u0441\u044c \u0441\u043e\u0442\u043d\u044f\u043c\u0438, \u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 Story.\u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u043f\u0440\u0438\u0448\u0451\u043b \u043f\u0443\u0441\u0442\u044b\u043c. \u041f\u043e\u043b\u0435\u0437 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435 \u0431\u044b\u043b\u0430 \u043f\u044f\u0442\u0438\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438. \u041f\u044f\u0442\u044c \u0434\u043d\u0435\u0439 \u0431\u043e\u0442 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u00bb \u0438 \u043c\u043e\u043b\u0447\u0430\u043b.\u0421\u0432\u043e\u043f \u0432 fly.toml (swap_size_mb = 512) \u043d\u0430 Fly \u0442\u0430\u043a \u0438 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u2014 SwapTotal: 0. \u0424\u0438\u043a\u0441 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439: 1 \u0413\u0411, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u043b\u044b\u0432\u0430 \u0441 Habr \u2014 2 \u0413\u0411.\u0418 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e \u0447\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0441 \u0446\u0435\u043d\u043e\u0439. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043f\u0438\u0441\u0430\u043b \u00ab5, \u043d\u043e \u0447\u0435\u0441\u0442\u043d\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u00ab\u043f\u043e\u0434 \u0436\u0438\u0432\u044b\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c\u00bb \u2014 \u0442\u0440\u0438 \u0447\u0430\u0448\u043a\u0438 \u043a\u043e\u0444\u0435, \u0430 \u043d\u0435 \u043e\u0434\u043d\u0430.feedparser \u0431\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u0438\u043b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043d\u044f\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u044b\u043b \u0445\u0438\u0442\u0440\u0435\u0435 \u0438 \u043d\u0435 \u0438\u043c\u0435\u043b \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u043a\u043e\u0434\u0435 \u0441\u0431\u043e\u0440\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b \u043d\u0435\u0432\u0438\u043d\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432:feed = feedparser.parse(source.url)feedparser.parse(url) \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430. \u041e\u0434\u0438\u043d \u043c\u0451\u0440\u0442\u0432\u044b\u0439\/\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 RSS-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a (\u0438\u043b\u0438 \u0437\u0430\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0432\u0448\u0438\u0439 self-hosted RSSHub) \u2014 \u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432\u0438\u0441\u043d\u0435\u0442 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0434\u0436\u043e\u0431\u044b \u0441\u0442\u043e\u044f\u043b max_instances=1, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f:WARNING apscheduler: Execution of job &#171;run_pipeline&#187; skipped:                     maximum number of running instances reached (1)\u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u0430\u0441\u044c \u0432 \u043b\u043e\u0433\u0430\u0445 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043d\u044f. \u0411\u043e\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\u0424\u0438\u043a\u0441 \u2014 \u0434\u0432\u0430 \u0441\u043b\u043e\u044f. \u041f\u0435\u0440\u0432\u044b\u0439: \u0444\u0435\u0442\u0447\u0438\u043c \u0447\u0435\u0440\u0435\u0437 httpx \u0441 \u0436\u0451\u0441\u0442\u043a\u0438\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c, \u0430 feedparser \u043a\u043e\u0440\u043c\u0438\u043c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 (\u043e\u043d \u0442\u043e\u0433\u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0441\u0438\u0442, \u0431\u0435\u0437 \u0441\u0435\u0442\u0438):async def _download(url: str) -&gt; bytes:    async with httpx.AsyncClient(timeout=20.0, follow_redirects=True) as client:        resp = await client.get(url)        resp.raise_for_status()        return resp.content# \u0432 fetch():content = await _download(source.url)feed = await asyncio.to_thread(feedparser.parse, content)\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439 \u2014 \u043f\u043e\u044f\u0441 \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u043e\u0434\u0442\u044f\u0436\u0435\u043a: \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u043e\u043d \u0432 \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0438\u0441\u0448\u0438\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435 \u043c\u043e\u0433 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0434\u043e\u043b\u044c\u0448\u0435 10 \u043c\u0438\u043d\u0443\u0442:async def run_pipeline_guarded() -&gt; None:    try:        await asyncio.wait_for(run_pipeline(), timeout=600)    except asyncio.TimeoutError:        logger.error(&#171;run_pipeline exceeded 600s and was cancelled (stuck fetch?)&#187;)\u0423\u0440\u043e\u043a: \u0432\u043e\u0440\u043a\u0435\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u041e\u0431\u0449\u0430\u044f \u043d\u0438\u0442\u044c \u0443 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e\u0435\u0432: \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043b\u0438\u0442, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0437\u0434\u043e\u0440\u043e\u0432\u044b\u043c, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u0451\u0440\u0442\u0432. \u0423 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0443\u043f\u0430\u043b \u0431\u044b \u0445\u0435\u043b\u0441\u0447\u0435\u043a. \u0423 \u0432\u043e\u0440\u043a\u0435\u0440\u0430 \u0445\u0435\u043b\u0441\u0447\u0435\u043a\u0430 \u043d\u0435\u0442.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b watchdog \u2014 \u0434\u0436\u043e\u0431\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437 \u0432 30 \u043c\u0438\u043d\u0443\u0442 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u043f\u0438\u0448\u0435\u0442 \u043c\u043d\u0435 \u0432 \u043b\u0438\u0447\u043a\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435:async def check_pipeline_health(bot) -&gt; None:    age_h, pending = await _story_age_hours()    stale = age_h is None or age_h &gt;= 3.0    if stale and not _alerted:        # edge-triggered, \u043d\u0435 \u0441\u043f\u0430\u043c\u0438\u0442        await _notify_admins(bot, f&#187;\ud83d\udd34 \u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043c\u043e\u043b\u0447\u0438\u0442: \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c {age_h:.1f}\u0447 \u043d\u0430\u0437\u0430\u0434&#187;)\u041f\u043b\u044e\u0441 \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0431\u044d\u043a\u0430\u043f SQLite (\u043e\u043d\u043b\u0430\u0439\u043d-\u0431\u044d\u043a\u0430\u043f \u0447\u0435\u0440\u0435\u0437 sqlite3-API, \u0440\u043e\u0442\u0430\u0446\u0438\u044f 7 \u0434\u043d\u0435\u0439) \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438. \u041e\u0431\u0430 \u0444\u0438\u043a\u0441\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0439\u043c\u0430\u043b\u0438 \u0431\u044b \u043e\u0431\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u044b, \u0430 \u043d\u0435 \u0437\u0430 \u0434\u043d\u0438.\u0413\u043b\u0430\u0432\u0430 2. \u0427\u0442\u043e\u0431\u044b \u0447\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u0435\u0451 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c\u041a\u043e\u0433\u0434\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u043f\u043e\u0448\u0451\u043b \u0436\u0438\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a, \u044f \u0443\u043f\u0435\u0440\u0441\u044f \u0432 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435: \u0430 \u043b\u0435\u043d\u0442\u0430-\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f? \u0413\u043b\u0430\u0437\u0430\u043c\u0438 \u2014 \u0432\u0440\u043e\u0434\u0435 \u0434\u0430. \u041d\u043e \u00ab\u0432\u0440\u043e\u0434\u0435\u00bb \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0430.\u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u00ab\ud83d\udcca \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430\u00bb \u0432 \u0431\u043e\u0442\u0435 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0435\u0442 .md-\u0444\u0430\u0439\u043b \u0441 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u043c \u043e\u0442\u0447\u0451\u0442\u043e\u043c: \u0432\u043e\u0440\u043e\u043d\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438, DAU\/WAU, \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u0441\u0435\u043d\u0442\u0438\u043c\u0435\u043d\u0442, \u0442\u043e\u043f-\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u2014 \u0441 ASCII-\u0431\u0430\u0440\u0430\u043c\u0438 \u0438 mermaid-\u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438 (\u0440\u0435\u043d\u0434\u0435\u0440\u044f\u0442\u0441\u044f \u0432 GitHub\/Obsidian). \u041f\u043e\u0447\u0435\u043c\u0443 \u0444\u0430\u0439\u043b, \u0430 \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: \u0435\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0449\u0438\u043a\u0435, \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 \u043f\u0440\u043e\u0448\u043b\u044b\u043c.\u0426\u0438\u0444\u0440\u044b \u0447\u0435\u0440\u0435\u0437 10 \u0434\u043d\u0435\u0439 (78 \u044e\u0437\u0435\u0440\u043e\u0432 \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439, \u043d\u043e \u0442\u0440\u0435\u043d\u0434\u044b \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f):\u041c\u0435\u0442\u0440\u0438\u043a\u0430\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f (\u0445\u043e\u0442\u044c \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435)87%\u0413\u043b\u0443\u0431\u0438\u043d\u0430~18 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 (\u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u0435\u043d\u044c)~29%WAU \/ \u0432\u0441\u0435\u0433\u043e63 \/ 78\u0414\u043b\u044f \u0445\u043e\u043b\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430 \u2014 \u0436\u0438\u0432\u043e. \u041d\u043e \u0431\u044b\u043b \u043e\u0434\u0438\u043d \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u044f\u043c\u043e \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u043b\u0441\u044f: \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043b\u0430\u0439\u043a\u043e\u0432 \u043a \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u0430\u043c \u0434\u0435\u0440\u0436\u0430\u043b\u043e\u0441\u044c ~50\/50. \u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043e\u0446\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442\u0441\u044f. \u0412\u043e\u0442 \u0435\u0433\u043e \u0438 \u043f\u043e\u0448\u0451\u043b \u0447\u0438\u043d\u0438\u0442\u044c \u2014 \u0438 \u043d\u0430\u0440\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u043e\u043a\u0430.\u0413\u043b\u0430\u0432\u0430 3. \u0410\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u0441\u0430\u043c\u0430 \u0441\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c (\u0430 \u044f \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b)\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u00ab\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435\u00bb: \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u043b \u0432\u0435\u0441\u0430 \u0432 \u0441\u043a\u043e\u0440\u0438\u043d\u0433\u0435, \u0441\u043d\u0438\u0437\u0438\u043b \u0434\u043e\u043b\u044e \u0441\u0435\u0440\u0435\u043d\u0434\u0438\u043f\u043d\u043e\u0441\u0442\u0438 (\u0430\u043d\u0442\u0438-\u0431\u0430\u0431\u043b\u0430) \u0441 35% \u0434\u043e 15%, \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0431\u0435\u0437 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043a\u0443\u0441\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0432 \u0442\u043e\u0447\u043a\u0443\u00bb, \u0431\u0435\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0439. \u0417\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u0441\u043c\u043e\u0442\u0440\u044e \u043e\u0442\u0447\u0451\u0442 \u2014 50\/50 \u043a\u0430\u043a \u0441\u0442\u043e\u044f\u043b\u043e, \u0442\u0430\u043a \u0438 \u0441\u0442\u043e\u0438\u0442.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0435 \u0442\u0443\u0434\u0430. \u041e\u0431\u0449\u0438\u0439 \u043b\u0430\u0439\u043a\/\u0434\u0438\u0437\u043b\u0430\u0439\u043a \u0437\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0443\u043f\u0430\u044f \u043b\u0438\u043d\u0437\u0430. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u043e\u0442\u0447\u0451\u0442 \u0440\u0430\u0437\u0440\u0435\u0437 \u043f\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u2014 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439:RBC          70% \ud83d\ude48   Habr         +0.30 \ud83d\udc4dLenta.ru     61% \ud83d\ude48   TechCrunch   +0.33 \ud83d\udc4d                      Ars Technica +0.33 \ud83d\udc4dTech-\u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f (\u0430 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a\u043e \u043c\u043d\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441 Habr \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438) \u043b\u044e\u0431\u0438\u0442 tech-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438 \u043e\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442 \u0440\u0443\u0441\u0441\u043a\u0438\u0435 \u043e\u0431\u0449\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438. \u0410 Lenta + RBC \u0431\u044b\u043b\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u0430\u043c\u044b\u043c\u0438 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u2014 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u043b\u0435\u043d\u0442\u0430 \u043d\u0430 50% \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.\u0422\u044e\u043d\u0438\u043d\u0433 \u0432\u0435\u0441\u043e\u0432 \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u0433 \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435: \u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044f \u0431\u044b\u043b affinity \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \u0438 \u0442\u0435\u0433\u0430\u043c, \u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. \u0414\u043e\u0431\u0430\u0432\u0438\u043b \u2014 \u0440\u043e\u0432\u043d\u043e \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438, \u0442\u043e\u043b\u044c\u043a\u043e per-source:# \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0432\u0435\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0432 -1..1if kind in (&#171;like&#187;, &#171;open&#187;):    source_interests[sid] = min(1.0, source_interests.get(sid, 0.0) + 0.3)elif kind == &#171;dislike&#187;:    source_interests[sid] = max(-1.0, source_interests.get(sid, 0.0) &#8212; 0.35)\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0441\u043a\u043e\u0440\u0438\u043d\u0433 \u0447\u043b\u0435\u043d + 0.15 * source_affinity. \u041f\u043b\u044e\u0441 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440: \u0434\u043b\u044f \u044e\u0437\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u043b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0431\u0435\u0440\u0451\u043c \u043a\u0440\u0430\u0443\u0434\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u2014 \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0436\u0435 \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0435\u043b \u043c\u0435\u043d\u044c\u0448\u0435 \u0448\u0438\u0440\u043e\u043a\u043e-\u043d\u0435\u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432.\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u043e\u0431\u0435\u0434\u0430. \u0414\u0435\u043f\u043b\u043e\u044e, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043e\u0442\u0447\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043d\u044c \u2014 \u0438\u2026\u0413\u043b\u0430\u0432\u0430 4. \u041c\u0435\u0442\u0440\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u0440\u0430\u0432\u0438\u043b \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u2026\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0443\u0445\u043d\u0443\u043b\u0430 \u0441 50% \u0434\u043e 30%. \u0414\u0438\u0437\u043b\u0430\u0439\u043a\u0438 \u0432\u0437\u043b\u0435\u0442\u0435\u043b\u0438 \u0441 62 \u0434\u043e 228. \u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u00ab\u0445\u0443\u0434\u0448\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432\u00bb \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u0435: dev.to 91% \ud83d\ude48, Hacker News 80% \ud83d\ude48, \u0434\u0430\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0437\u0430\u0445\u0432\u0430\u043b\u0435\u043d\u043d\u044b\u0439 Habr.\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u2014 \u00ab\u044f \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b \u0441\u0432\u043e\u0438\u043c source-affinity, \u043d\u0430\u0434\u043e \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u00bb. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0430\u043d\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435: \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0434\u0430\u043d\u043d\u044b\u0435.SELECT user_id, count(*) FROM interactions WHERE kind=&#8217;dislike&#8217;GROUP BY user_id ORDER BY 2 DESC LIMIT 3;  user 66  -&gt;  106 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u043e\u0432  user 73  -&gt;   31 \u0434\u0438\u0437\u043b\u0430\u0439\u043a  \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 -&gt; \u0435\u0434\u0438\u043d\u0438\u0446\u044b\u041e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b 106 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u043e\u0432 \u0438\u0437 228 \u2014 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443. \u0412\u0434\u0432\u043e\u0451\u043c \u0441 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 60%. \u0415\u0441\u043b\u0438 \u0438\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a ~50%.\u0418 \u0432\u043e\u0442 \u0432 \u0447\u0451\u043c \u0431\u044b\u043b\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430, \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0441\u044b\u0440\u044b\u0435 \u0440\u0435\u0430\u043a\u0446\u0438\u0438. \u041e\u0434\u0438\u043d \u043c\u0430\u0441\u0441-\u0434\u0438\u0437\u043b\u0430\u0439\u043a\u0435\u0440 \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043b \u0441\u0432\u043e\u0438 106 \ud83d\ude48 \u043f\u043e \u0432\u0441\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u2014 \u0438 \u043e\u0442\u0440\u0430\u0432\u0438\u043b \u043e\u0431\u0430: \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 30% \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 ~42%, \u0430 \u043f\u0440\u0438\u043e\u0440 \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0432\u0441\u044f\u043a\u0443\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u043e\u0441\u0442\u044c (\u0432\u0441\u0451 \u0441\u0442\u0430\u043b\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u00ab\u043d\u0430 80-100% \u043d\u0435\u043b\u044e\u0431\u0438\u043c\u044b\u043c\u00bb).\u0424\u0438\u043a\u0441 \u2014 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u044e\u0437\u0435\u0440\u0430\u043c, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u00b11 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a:WITH per_user_source AS (  SELECT i.user_id, st.source_id,         SUM(i.kind=&#8217;like&#8217;) &#8212; SUM(i.kind=&#8217;dislike&#8217;) AS net  FROM interactions i JOIN stories st ON st.id = i.story_id  WHERE i.kind IN (&#8216;like&#8217;,&#8217;dislike&#8217;)  GROUP BY i.user_id, st.source_id)SELECT source_id,       SUM(CASE WHEN net&gt;0 THEN 1 WHEN net&lt;0 THEN -1 ELSE 0 END) AS net_users,       COUNT(*) AS ratersFROM per_user_source GROUP BY source_id HAVING raters &gt;= 3;\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0434\u0430 \u043f\u0440\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c. \u0420\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u044e\u0437\u0435\u0440\u0430\u043c \u2014 42% (\u0430 \u043d\u0435 30%). \u0418 \u043f\u0440\u0438\u043e\u0440 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043b \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u043c\u044b\u043c:\u0425\u041e\u0420\u041e\u0428\u041e:  TechCrunch +0.33 \u00b7 Ars Technica +0.33 \u00b7 Habr +0.11\u041f\u041b\u041e\u0425\u041e:   Habr Best -1.00 \u00b7 BBC -0.50 \u00b7 Hacker News -0.50 \u00b7 RBC\/Lenta -0.31\u0423\u0440\u043e\u043a \u0434\u043e\u0440\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0444\u0438\u0447\u0438: \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0441\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a. \u041d\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 78 \u044e\u0437\u0435\u0440\u043e\u0432 \u043e\u0434\u0438\u043d \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0441\u0442 \u0441 \ud83d\ude48 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 46% \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0420\u043e\u0431\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u043a \u0432\u044b\u0431\u0440\u043e\u0441\u0430\u043c \u0432\u0430\u0436\u043d\u0435\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0418 \u2014 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u0443\u0439, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c: \u044f \u0431\u044b\u043b \u0432 \u0448\u0430\u0433\u0435 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0444\u0438\u0447\u0443 \u0438\u0437-\u0437\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f.\u0413\u043b\u0430\u0432\u0430 5. \u041c\u0435\u043d\u044c\u0448\u0435, \u043d\u043e \u043b\u0443\u0447\u0448\u043542% \u2014 \u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e (\u043d\u0435\u0442\u0442\u043e-\u044e\u0437\u0435\u0440 \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0435\u0434\u043e\u0432\u043e\u043b\u0435\u043d). \u0417\u0430\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u044b\u043b \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442:Habr Best \u2014 \u22121.00: 4 \u0438\u0437 4 \u043e\u0446\u0435\u043d\u0438\u0432\u0448\u0438\u0445 \u0434\u0438\u0437\u043b\u0430\u0439\u043a\u043d\u0443\u043b\u0438. \u041e\u043d, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Habr.dev.to, Lobsters \u2014 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438-\u0444\u0430\u0439\u0440\u0445\u043e\u0443\u0437\u044b: \u043c\u043d\u043e\u0433\u043e, \u0448\u0443\u043c\u043d\u043e, \u043d\u0438\u0437\u043a\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b.TechCrunch, Ars Technica, Habr \u2014 \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 tech, \u0432\u0441\u0435\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u0442.\u0412\u044b\u0432\u043e\u0434 \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u0441\u044f \u0441\u0430\u043c: \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u2014 \u0444\u0430\u0439\u0440\u0445\u043e\u0443\u0437\u0443. \u042f \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043b \u0442\u0440\u0438 \u0445\u0443\u0434\u0448\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (Habr Best, dev.to, Lobsters) \u2014 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483158","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483158","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=483158"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483158\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}