<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>PythonTalk</title><subtitle>Привет, меня зовут Олег Булыгин 👋

🐍 Здесь я делюсь полезной информацией для тех, кто пишет код на Python: от разработки до Data Science. </subtitle><author><name>PythonTalk</name></author><id>https://teletype.in/atom/pythontalk</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/pythontalk?offset=0"></link><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/pythontalk?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-25T13:03:18.019Z</updated><entry><id>pythontalk:deepby-data-analysis-platform</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/deepby-data-analysis-platform?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Нейронка, которая сама копается в данных? 📊</title><published>2025-07-06T04:06:38.161Z</published><updated>2025-07-06T04:06:38.161Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/58/5d/585db3e6-aa11-414f-995f-e01eee9b465e.png"></media:thumbnail><category term="opensource" label="Опенсорс"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/cf/09/cf097b87-c06b-4765-8016-4f3e0a914c2e.png&quot;&gt;DeepBI — это open-source платформа для анализа данных, построенная на LLM. Идея простая: вместо того чтобы писать SQL-запросы или код на Python, вы просто задаете вопросы на естественном языке.</summary><content type="html">
  &lt;p id=&quot;uQGD&quot;&gt;&lt;a href=&quot;https://github.com/DeepInsight-AI/DeepBI&quot; target=&quot;_blank&quot;&gt;DeepBI&lt;/a&gt; — это open-source платформа для анализа данных, построенная на LLM. Идея простая: вместо того чтобы писать SQL-запросы или код на Python, вы просто задаете вопросы на естественном языке.&lt;/p&gt;
  &lt;blockquote id=&quot;ofbp&quot;&gt;DeepBI is an AI-native data analysis platform. DeepBI leverages the power of large language models to explore, query, visualize, and share data from any data source.&lt;/blockquote&gt;
  &lt;p id=&quot;VIw4&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;yaE1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cf/09/cf097b87-c06b-4765-8016-4f3e0a914c2e.png&quot; width=&quot;1267&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;fRM2&quot;&gt;Что обещают?&lt;/h2&gt;
  &lt;p id=&quot;l9dR&quot;&gt;Давайте посмотрим на список фич, которые заявлены в репозитории.&lt;/p&gt;
  &lt;ul id=&quot;bIA6&quot;&gt;
    &lt;li id=&quot;gR0s&quot;&gt;&lt;strong&gt;Анализ данных в формате диалога.&lt;/strong&gt; Самая мякотка. Вы просто пишете на человеческом языке: «покажи мне топ-5 самых продаваемых товаров в прошлом месяце» и (в теории) получаете готовый результат.&lt;/li&gt;
    &lt;li id=&quot;f3ff&quot;&gt;&lt;strong&gt;Генерация запросов и визуализаций.&lt;/strong&gt; Платформа не просто показывает результат, но и может сгенерировать персистентный запрос или график, который потом можно добавить в дашборд.&lt;/li&gt;
    &lt;li id=&quot;5gkp&quot;&gt;&lt;strong&gt;Дашборды.&lt;/strong&gt; Куда же без них. Собранные визуализации можно компоновать в привычные дашборды.&lt;/li&gt;
    &lt;li id=&quot;xiTO&quot;&gt;&lt;strong&gt;Автоматические отчёты.&lt;/strong&gt; А вот это уже интересно. Заявляется фича (пока в разработке 🌚) по автоматической генерации полноценных отчётов по текстовому заданию.&lt;/li&gt;
    &lt;li id=&quot;4WGI&quot;&gt;&lt;strong&gt;Поддержка разных источников данных.&lt;/strong&gt; Список вполне приличный: MySQL, PostgreSQL, Doris, StarRocks, MongoDB и CSV/Excel.&lt;/li&gt;
    &lt;li id=&quot;t4eS&quot;&gt;&lt;strong&gt;Мультиплатформенность.&lt;/strong&gt; Запустить можно где угодно: Windows (даже есть .exe), Linux, Mac.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;yfvi&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;oQzw&quot;&gt;Как это пощупать своими руками?&lt;/h2&gt;
  &lt;p id=&quot;ToIr&quot;&gt;Раз проект open-source, то грех не попробовать его развернуть локально. Вариантов несколько, на любой вкус и цвет.&lt;/p&gt;
  &lt;h3 id=&quot;LPc4&quot;&gt;📦 Установка на Windows&lt;/h3&gt;
  &lt;p id=&quot;ofIi&quot;&gt;Для тех, кто боится консоли, есть exe-шник. Скачиваете архив, распаковываете, запускаете. Проще не придумаешь.&lt;/p&gt;
  &lt;h3 id=&quot;x1sW&quot;&gt;🐳 Развертывание через Docker&lt;/h3&gt;
  &lt;p id=&quot;F8id&quot;&gt;Всё сводится к паре команд:&lt;/p&gt;
  &lt;pre id=&quot;YIPc&quot; data-lang=&quot;bash&quot;&gt;# Клонируем репозиторий
git clone https://github.com/DeepInsight-AI/DeepBI.git
cd DeepBI

# Запускаем скрипт установки
./Install.sh&lt;/pre&gt;
  &lt;p id=&quot;gojI&quot;&gt;После этого сервис будет доступен по адресу http://ip:8338.&lt;/p&gt;
  &lt;h3 id=&quot;Cl1D&quot;&gt;🐧 Установка на Ubuntu&lt;/h3&gt;
  &lt;p id=&quot;Llhp&quot;&gt;Потребуется предварительно поставить redis, postgresql и python 3.8.x. Все шаги подробно описаны в README, но в целом сводятся к запуску ubuntu_install.sh.&lt;/p&gt;
  &lt;p id=&quot;5Ozs&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;fDX2&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&amp;quot;data:image/svg+xml,%3Csvg xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27;%3E%3Crect width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27; fill=&amp;#x27;none&amp;#x27;/%3E%3Ccircle cx=&amp;#x27;4&amp;#x27; cy=&amp;#x27;4&amp;#x27; r=&amp;#x27;1&amp;#x27; fill=&amp;#x27;rgba(255,255,255,0.04)&amp;#x27;/%3E%3C/svg%3E&amp;quot;);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;div class=&amp;quot;promo-block&amp;quot;&gt;
        &lt;div class=&amp;quot;main-card&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;main-card-header&amp;quot;&gt;
                &lt;h3&gt;&lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;&lt;/svg&gt;&lt;span&gt;Поддержать&lt;/span&gt;&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;p class=&amp;quot;link-text&amp;quot;&gt;pay.cloudtips.ru/p/3a37d9ef&lt;/p&gt;
        &lt;/div&gt;
        &lt;div class=&amp;quot;secondary-actions&amp;quot;&gt;
            &lt;div class=&amp;quot;action-item telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper telegram-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Канал в Telegram&lt;/h4&gt;
                    &lt;span&gt;t.me/pythontalk_ru&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
             &lt;div class=&amp;quot;action-item dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper dzen-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Блог на Дзен&lt;/h4&gt;
                    &lt;span&gt;dzen.ru/pythontalk&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const checkIconHTML = &amp;#x60;&lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;&lt;/svg&gt;&amp;#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&amp;#x27;.main-card-header h3&amp;#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        header.innerHTML = &amp;#x60;&lt;span class=&amp;quot;icon-check&amp;quot;&gt;${checkIconHTML}&lt;/span&gt;&lt;span&gt;Ссылка скопирована!&lt;/span&gt;&amp;#x60;;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&amp;#x27;.copy-indicator&amp;#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            const mainCard = document.querySelector(&amp;#x27;.main-card&amp;#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                if (qrContainer &amp;&amp; typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &amp;quot;#000000&amp;quot;, colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&amp;#x27;.action-item&amp;#x27;).forEach(setupItemCopyAction);
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:storm</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/storm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>STORM: Как LLM от Стэнфорда автоматизирует ресёрч и пишет статьи за вас</title><published>2025-07-03T10:20:07.177Z</published><updated>2025-07-03T10:28:41.914Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/b2/07/b2072d46-7575-4ad2-9231-d598ad7ca776.png"></media:thumbnail><category term="opensource" label="Опенсорс"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ad/29/ad29074f-24d0-46eb-b337-cfb6f823f569.png&quot;&gt;Вот вам нужно погрузиться в новую сложную тему. Впереди часы гуглежа, десятки открытых вкладок, попытки отделить зёрна от плевел и собрать всё в единую картину. Процесс мучительный и не всегда продуктивный.</summary><content type="html">
  &lt;p id=&quot;3sGI&quot;&gt;Вот вам нужно погрузиться в новую сложную тему. Впереди часы гуглежа, десятки открытых вкладок, попытки отделить зёрна от плевел и собрать всё в единую картину. Процесс мучительный и не всегда продуктивный.&lt;/p&gt;
  &lt;p id=&quot;hlk7&quot;&gt;И вот, кажется, ребята из Стэнфорда решили эту проблему если не полностью, то хотя бы частично автоматизировать. Они выкатили опенсорсный проект &lt;strong&gt;STORM&lt;/strong&gt; — систему на базе LLM, которая берёт на себя самую нудную часть работы: исследование темы и создание структурированного черновика статьи в стиле Википедии. Сразу с цитатами и ссылками на источники.&lt;/p&gt;
  &lt;p id=&quot;OtVM&quot;&gt;Конечно, это не волшебная кнопка «сделать зашибись». Сами авторы честно говорят, что на выходе получается не готовая к публикации работа, а скорее очень качественный и подробный репорт, который нужно дорабатывать. &lt;/p&gt;
  &lt;figure id=&quot;ePoq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ad/29/ad29074f-24d0-46eb-b337-cfb6f823f569.png&quot; width=&quot;4422&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;bkjV&quot;&gt;Что это за STORM такой и как он работает?&lt;/h2&gt;
  &lt;p id=&quot;iHZp&quot;&gt;На первый взгляд, идея не нова — обернуть LLM в поисковик. Но дьявол, как всегда, в деталях. Вместо того чтобы тупо промптить модель в стиле «расскажи мне о X», STORM подходит к задаче куда хитрее. Весь процесс делится на два этапа:&lt;/p&gt;
  &lt;ol id=&quot;AHhu&quot;&gt;
    &lt;li id=&quot;yQAI&quot;&gt;&lt;strong&gt;Pre-writing (Исследование):&lt;/strong&gt; Система проводит интернет-исследование, чтобы собрать материал и составить план статьи.&lt;/li&gt;
    &lt;li id=&quot;8pZw&quot;&gt;&lt;strong&gt;Writing (Написание):&lt;/strong&gt; На основе собранных данных и плана генерируется полноценная статья с цитатами.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;0xSE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/5f/305fde94-a68c-41f0-b8f4-c56bb5631500.png&quot; width=&quot;731&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;x8rY&quot;&gt;Ключевая фишка — в первом этапе. Чтобы сделать исследование глубоким и разносторонним, STORM использует две стратегии:&lt;/p&gt;
  &lt;ul id=&quot;bbvc&quot;&gt;
    &lt;li id=&quot;Pcrd&quot;&gt;&lt;strong&gt;Perspective-Guided Question Asking:&lt;/strong&gt; Система сначала изучает похожие статьи, чтобы понять, с каких разных точек зрения (например, академической, индустриальной, исторической) можно взглянуть на тему. А потом использует эти «перспективы», чтобы генерировать вопросы.&lt;/li&gt;
    &lt;li id=&quot;6uG5&quot;&gt;&lt;strong&gt;Simulated Conversation:&lt;/strong&gt; STORM имитирует диалог между автором статьи и экспертом по теме. Эксперт «опирается» на найденные в интернете источники. Это помогает LLM не просто вываливать факты, а углублять своё понимание темы и задавать уточняющие, релевантные вопросы по ходу дела.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5xsu&quot;&gt;По сути, STORM не просто ищет информацию, а пытается воссоздать мыслительный процесс исследователя: сначала определяет разные углы обзора, а потом ведёт внутренний диалог, чтобы разобраться в теме. Это и отличает его от простых «summarizer»-ов.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;3YiC&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;lMIv&quot;&gt;Co-STORM: А если я хочу влезть в процесс?&lt;/h2&gt;
  &lt;p id=&quot;FVuD&quot;&gt;Понимая, что полная автоматизация не всегда гуд, разработчики добавили режим &lt;strong&gt;Co-STORM&lt;/strong&gt;. Он позволяет человеку активно участвовать в процессе. В этой симуляции есть три типа агентов:&lt;/p&gt;
  &lt;ol id=&quot;dPz1&quot;&gt;
    &lt;li id=&quot;s9E6&quot;&gt;&lt;strong&gt;LLM-эксперты:&lt;/strong&gt; Отвечают на вопросы, опираясь на внешние источники.&lt;/li&gt;
    &lt;li id=&quot;sxmn&quot;&gt;&lt;strong&gt;Модератор:&lt;/strong&gt; Задаёт наводящие вопросы, чтобы дискуссия не затухала.&lt;/li&gt;
    &lt;li id=&quot;DBeb&quot;&gt;&lt;strong&gt;Человек:&lt;/strong&gt; Может либо просто наблюдать за процессом, либо в любой момент вмешаться, задать свой вопрос и направить исследование в нужное русло.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ndPy&quot;&gt;Для удобства вся собранная информация организуется в виде динамической ментальной карты (mind map), что должно снижать когнитивную нагрузку, когда исследование становится слишком глубоким.&lt;/p&gt;
  &lt;figure id=&quot;ZJUG&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/05/02058258-a5d7-44bd-92e6-3dae04bc478b.png&quot; width=&quot;823.9999999999999&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;OiEG&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;EhiY&quot;&gt;Как это пощупать?&lt;/h2&gt;
  &lt;p id=&quot;ktzC&quot;&gt;Проект &lt;a href=&quot;https://github.com/stanford-oval/storm/tree/main&quot; target=&quot;_blank&quot;&gt;доступен&lt;/a&gt; на GitHub и легко ставится через pip:&lt;/p&gt;
  &lt;pre id=&quot;Ddyg&quot;&gt;pip install knowledge-storm&lt;/pre&gt;
  &lt;p id=&quot;faZt&quot;&gt;Дальше всё довольно модульно. Можно настраивать разные LLM (под капотом litellm, так что поддерживается почти всё, включая OpenAI, Azure и др.) и разные поисковые движки (Bing, You.com, Google, DuckDuckGo и т.д.).&lt;/p&gt;
  &lt;p id=&quot;fTdz&quot;&gt;Вот упрощённый пример запуска из документации:&lt;/p&gt;
  &lt;pre id=&quot;fqrd&quot; data-lang=&quot;python&quot;&gt;import os
from knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigs
from knowledge_storm.lm import LitellmModel
from knowledge_storm.rm import YouRM # Или BingSearch, GoogleSearch...

# 1. Настраиваем модели
lm_configs = STORMWikiLMConfigs()
# Для симуляции диалога можно взять модель попроще и побыстрее
gpt_35 = LitellmModel(model=&amp;#x27;gpt-3.5-turbo&amp;#x27;, ...) 
# А для генерации самой статьи — что-то помощнее
gpt_4o = LitellmModel(model=&amp;#x27;gpt-4o&amp;#x27;, ...)
lm_configs.set_conv_simulator_lm(gpt_35)
lm_configs.set_article_gen_lm(gpt_4o)
# ... и другие компоненты

# 2. Настраиваем поисковик (retriever)
rm = YouRM(ydc_api_key=os.getenv(&amp;#x27;YDC_API_KEY&amp;#x27;))

# 3. Запускаем движок
engine_args = STORMWikiRunnerArguments(...)
runner = STORMWikiRunner(engine_args, lm_configs, rm)

runner.run(
    topic=&amp;quot;Challenges in Python&amp;#x27;s Global Interpreter Lock (GIL)&amp;quot;,
    do_research=True,
    do_generate_outline=True,
    do_generate_article=True,
    do_polish_article=True,
)

runner.summary()&lt;/pre&gt;
  &lt;p id=&quot;tPcA&quot;&gt;Выглядит довольно гибко. Можно запускать только нужные этапы, подсовывать свои поисковики и модели, что для кастомных задач самое то.&lt;/p&gt;
  &lt;p id=&quot;lYUJ&quot;&gt;А для тех, кто не хочет ничего ставить, есть &lt;a href=&quot;https://dzen.ru/away?to=https%3A%2F%2Fstorm-project.stanford.edu%2F&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;демо-сайт&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;22LY&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ZLZv&quot;&gt;Так это заменит исследователей и авторов?&lt;/h2&gt;
  &lt;p id=&quot;bQaY&quot;&gt;Конечно, нет. И заявления типа &amp;quot;STORM writes research papers like a PhD&amp;quot; — это классический пример заигрывания с мечтами людей, которые хотят волшебную таблетку.&lt;/p&gt;
  &lt;p id=&quot;qu9e&quot;&gt;STORM — это инструмент. Примерно как продвинутый IDE для программиста. Он не напишет за вас весь проект, но избавит от рутины, подсветит ошибки и ускорит работу. Здесь то же самое: STORM берёт на себя самую муторную часть — первоначальный сбор и структурирование информации.&lt;/p&gt;
  &lt;p id=&quot;1pj7&quot;&gt;Ценность ведь не в самом сгенерированном тексте (контенте), который и так можно надергать из сети. Ценность в том, чтобы на основе этого черновика сделать выводы, добавить собственную экспертизу и создать что-то действительно новое. А на это пока способны только человеки 🧠&lt;/p&gt;
  &lt;p id=&quot;fxbV&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;iqzr&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&amp;quot;data:image/svg+xml,%3Csvg xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27;%3E%3Crect width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27; fill=&amp;#x27;none&amp;#x27;/%3E%3Ccircle cx=&amp;#x27;4&amp;#x27; cy=&amp;#x27;4&amp;#x27; r=&amp;#x27;1&amp;#x27; fill=&amp;#x27;rgba(255,255,255,0.04)&amp;#x27;/%3E%3C/svg%3E&amp;quot;);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;div class=&amp;quot;promo-block&amp;quot;&gt;
        &lt;div class=&amp;quot;main-card&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;main-card-header&amp;quot;&gt;
                &lt;h3&gt;&lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;&lt;/svg&gt;&lt;span&gt;Поддержать&lt;/span&gt;&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;p class=&amp;quot;link-text&amp;quot;&gt;pay.cloudtips.ru/p/3a37d9ef&lt;/p&gt;
        &lt;/div&gt;
        &lt;div class=&amp;quot;secondary-actions&amp;quot;&gt;
            &lt;div class=&amp;quot;action-item telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper telegram-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Канал в Telegram&lt;/h4&gt;
                    &lt;span&gt;t.me/pythontalk_ru&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
             &lt;div class=&amp;quot;action-item dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper dzen-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Блог на Дзен&lt;/h4&gt;
                    &lt;span&gt;dzen.ru/pythontalk&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const checkIconHTML = &amp;#x60;&lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;&lt;/svg&gt;&amp;#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&amp;#x27;.main-card-header h3&amp;#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        header.innerHTML = &amp;#x60;&lt;span class=&amp;quot;icon-check&amp;quot;&gt;${checkIconHTML}&lt;/span&gt;&lt;span&gt;Ссылка скопирована!&lt;/span&gt;&amp;#x60;;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&amp;#x27;.copy-indicator&amp;#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            const mainCard = document.querySelector(&amp;#x27;.main-card&amp;#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                if (qrContainer &amp;&amp; typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &amp;quot;#000000&amp;quot;, colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&amp;#x27;.action-item&amp;#x27;).forEach(setupItemCopyAction);
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:machine-learning-q-and-ai-book</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/machine-learning-q-and-ai-book?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Machine Learning Q and AI: книга от Себастьяна Рашки для тех, кто уже не джун</title><published>2025-07-02T15:24:30.494Z</published><updated>2025-07-02T15:24:30.494Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/7a/f5/7af54138-b651-43ba-b743-153a7ba80a5a.png"></media:thumbnail><category term="prochee" label="Прочее"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/9a/23/9a231918-9172-467b-bf45-932ef0a21d51.png&quot;&gt;Когда речь заходит об учебной литературе по ML, обычно на ум приходят либо совсем базовые вещи для новичков, либо хардкорные академические талмуды, которые без бутылки аспирина не осилить. Найти что-то толковое для человека, который уже вышел из песочницы, но ещё не готов врываться в рисерч, — та ещё задачка.</summary><content type="html">
  &lt;p id=&quot;dKjH&quot;&gt;Когда речь заходит об учебной литературе по ML, обычно на ум приходят либо совсем базовые вещи для новичков, либо хардкорные академические талмуды, которые без бутылки аспирина не осилить. Найти что-то толковое для человека, который уже вышел из песочницы, но ещё не готов врываться в рисерч, — та ещё задачка.&lt;/p&gt;
  &lt;p id=&quot;gBFG&quot;&gt;И тут на сцену выходит Себастьян Рашка. Если вы вдруг не в курсе, это один из core-разработчиков scikit-learn и автор нескольких книг, которые уже стали культовыми. И его работа Machine Learning Q and AI — это книга для тех, у кого уже есть база, но остались вопросы и пробелы.&lt;/p&gt;
  &lt;figure id=&quot;CCRw&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/23/9a231918-9172-467b-bf45-932ef0a21d51.png&quot; width=&quot;353.99999999999994&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pjTz&quot;&gt;Вся книга — это 30 самостоятельных глав, каждая из которых посвящена одному конкретному вопросу. Никакой воды и долгих вступлений. Вы открываете нужную главу и получаете концентрированный ответ с диаграммами, кодом и упражнениями для закрепления.&lt;/p&gt;
  &lt;p id=&quot;6NZm&quot;&gt;Эта книга не пытается заигрывать с новичками, обещая сделать из них мидлов за полгода. Она честно ориентирована на тех, кто уже «в теме».&lt;/p&gt;
  &lt;p id=&quot;YexN&quot;&gt;Темы тут вполне себе взрослые:&lt;/p&gt;
  &lt;ul id=&quot;Ug0a&quot;&gt;
    &lt;li id=&quot;z2qq&quot;&gt;Парадигмы обучения на нескольких GPU.&lt;/li&gt;
    &lt;li id=&quot;T6SJ&quot;&gt;Файнтюнинг трансформеров (и чем отличаются энкодеры от декодеров).&lt;/li&gt;
    &lt;li id=&quot;8R3E&quot;&gt;Концепции, лежащие в основе Vision Transformers.&lt;/li&gt;
    &lt;li id=&quot;ZpsW&quot;&gt;Как правильно считать доверительные интервалы для моделей.&lt;/li&gt;
    &lt;li id=&quot;QodQ&quot;&gt;Data-centric подход к AI.&lt;/li&gt;
    &lt;li id=&quot;3JEl&quot;&gt;Методы ускорения инференса моделей.&lt;/li&gt;
    &lt;li id=&quot;jSYc&quot;&gt;...и ещё два десятка не менее интересных вопросов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;SCOl&quot;&gt;Каждая глава — это, по сути, готовый мини-гайд по конкретной теме. Это не просто теория, а материал, подкреплённый Python-кодом и ссылками для тех, кто хочет копнуть ещё глубже.&lt;/p&gt;
  &lt;p id=&quot;1euU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;1D6M&quot;&gt;Книга находится в &lt;a href=&quot;https://sebastianraschka.com/books/ml-q-and-ai-chapters/introduction/#table-of-contents&quot; target=&quot;_blank&quot;&gt;полностью открытом доступе&lt;/a&gt;. Да, бесплатно. Не нужно ничего покупать, воровать или ждать слива на торренты.&lt;/p&gt;
  &lt;p id=&quot;M3n4&quot;&gt;Более того, все дополнительные материалы, включая код и данные для упражнений, лежат в &lt;a href=&quot;https://www.google.com/url?sa=E&amp;q=https%3A%2F%2Fgithub.com%2Frasbt%2Fml-q-and-ai-book&quot; target=&quot;_blank&quot;&gt;о&lt;/a&gt;&lt;a href=&quot;https://github.com/rasbt/MachineLearning-QandAI-book?tab=readme-ov-file&quot; target=&quot;_blank&quot;&gt;тдельном репозитории на GitHub&lt;/a&gt;. &lt;/p&gt;
  &lt;p id=&quot;S69T&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;0QPq&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&amp;quot;data:image/svg+xml,%3Csvg xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27;%3E%3Crect width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27; fill=&amp;#x27;none&amp;#x27;/%3E%3Ccircle cx=&amp;#x27;4&amp;#x27; cy=&amp;#x27;4&amp;#x27; r=&amp;#x27;1&amp;#x27; fill=&amp;#x27;rgba(255,255,255,0.04)&amp;#x27;/%3E%3C/svg%3E&amp;quot;);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;div class=&amp;quot;promo-block&amp;quot;&gt;
        &lt;div class=&amp;quot;main-card&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;main-card-header&amp;quot;&gt;
                &lt;h3&gt;&lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;&lt;/svg&gt;&lt;span&gt;Поддержать&lt;/span&gt;&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;p class=&amp;quot;link-text&amp;quot;&gt;pay.cloudtips.ru/p/3a37d9ef&lt;/p&gt;
        &lt;/div&gt;
        &lt;div class=&amp;quot;secondary-actions&amp;quot;&gt;
            &lt;div class=&amp;quot;action-item telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper telegram-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Канал в Telegram&lt;/h4&gt;
                    &lt;span&gt;t.me/pythontalk_ru&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
             &lt;div class=&amp;quot;action-item dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper dzen-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Блог на Дзен&lt;/h4&gt;
                    &lt;span&gt;dzen.ru/pythontalk&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const checkIconHTML = &amp;#x60;&lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;&lt;/svg&gt;&amp;#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&amp;#x27;.main-card-header h3&amp;#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        header.innerHTML = &amp;#x60;&lt;span class=&amp;quot;icon-check&amp;quot;&gt;${checkIconHTML}&lt;/span&gt;&lt;span&gt;Ссылка скопирована!&lt;/span&gt;&amp;#x60;;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&amp;#x27;.copy-indicator&amp;#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            const mainCard = document.querySelector(&amp;#x27;.main-card&amp;#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                if (qrContainer &amp;&amp; typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &amp;quot;#000000&amp;quot;, colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&amp;#x27;.action-item&amp;#x27;).forEach(setupItemCopyAction);
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:baidu-ernie-4-5-release</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/baidu-ernie-4-5-release?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>ERNIE 4.5 от Baidu</title><published>2025-07-01T10:17:18.485Z</published><updated>2025-07-01T10:19:36.063Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f4/e5/f4e566ea-039d-4ac3-b609-2fa95fffbfec.png"></media:thumbnail><category term="opensource" label="Опенсорс"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/23/55/235585bd-a4cd-4c7e-b307-e151960c7aa9.png&quot;&gt;Китайский гигант Baidu выкатил в опенсорс целое семейство моделей ERNIE 4.5. И не просто веса на Hugging Face закинули, а представили полноценную экосистему с инструментами для дообучения и деплоя.</summary><content type="html">
  &lt;p id=&quot;79vb&quot;&gt;Китайский гигант Baidu выкатил &lt;a href=&quot;https://github.com/PaddlePaddle/ERNIE&quot; target=&quot;_blank&quot;&gt;в опенсорс&lt;/a&gt; целое семейство моделей ERNIE 4.5. И не просто &lt;a href=&quot;https://huggingface.co/baidu&quot; target=&quot;_blank&quot;&gt;веса на Hugging Face&lt;/a&gt; закинули, а представили полноценную экосистему с инструментами для дообучения и деплоя.&lt;/p&gt;
  &lt;p id=&quot;ey7K&quot;&gt;Давайте разберёмся, что там под капотом 👇🏻&lt;/p&gt;
  &lt;h2 id=&quot;rhFv&quot;&gt;Что вообще выкатили?&lt;/h2&gt;
  &lt;p id=&quot;hHnM&quot;&gt;ERNIE 4.5 — это не одна модель, а целая семья из 10 различных вариантов, построенных на архитектуре Mixture-of-Experts (MoE) и не только.&lt;/p&gt;
  &lt;ul id=&quot;YySp&quot;&gt;
    &lt;li id=&quot;pbDq&quot;&gt;&lt;strong&gt;Тяжеловесы (MoE):&lt;/strong&gt; Самая большая модель имеет 424B параметров, но благодаря MoE-архитектуре в каждый момент времени активны «всего» 47B. Есть и версия поменьше: 21B общих и 3B активных параметров.&lt;/li&gt;
    &lt;li id=&quot;BClj&quot;&gt;&lt;strong&gt;Малыш (Dense):&lt;/strong&gt; Для тех, у кого нет под рукой кластера из H100, есть компактная модель на 0.3B параметров.&lt;/li&gt;
    &lt;li id=&quot;HKDu&quot;&gt;&lt;strong&gt;Мультимодальность:&lt;/strong&gt; Часть моделей — классические LLM (текст-в-текст), а часть — VLM, способные понимать не только текст, но и изображения с видео.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;gFzI&quot;&gt;Все модели доступны под либеральной лицензией Apache 2.0. Это значит — бери и используй, в том числе в коммерческих проектах.&lt;/p&gt;
  &lt;p id=&quot;PzbR&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;RHZa&quot;&gt;Ключевые фишки: чем хвастаются китайцы?&lt;/h2&gt;
  &lt;p id=&quot;XP3h&quot;&gt;В документации Baidu выделяют три основных инновации, которые, по их мнению, и делают ERNIE 4.5 таким крутым.&lt;/p&gt;
  &lt;h3 id=&quot;z4ay&quot;&gt;1. Мультимодальная гетерогенная MoE-архитектура 🧠&lt;/h3&gt;
  &lt;p id=&quot;e6YY&quot;&gt;Звучит страшно, но идея простая. Обычно, когда пытаешься научить одну модель работать и с текстом, и с картинками, одна модальность начинает «мешать» другой. Китайцы заявляют, что придумали хитрую структуру MoE, где есть как общие для всех модальностей параметры, так и выделенные «эксперты» для каждой.&lt;/p&gt;
  &lt;blockquote id=&quot;ZSDw&quot;&gt;Проще говоря, они спроектировали модель так, чтобы понимание картинок не ухудшало, а наоборот, улучшало её способности в работе с текстом. Если это действительно так, то это серьёзный шаг вперёд в построении по-настоящему мультимодальных систем.&lt;/blockquote&gt;
  &lt;h3 id=&quot;RRmR&quot;&gt;2. Эффективная инфраструктура и деплой 🚀&lt;/h3&gt;
  &lt;p id=&quot;mwYR&quot;&gt;Весь этот зоопарк моделей обучался на собственном фреймворке Baidu — &lt;strong&gt;PaddlePaddle&lt;/strong&gt;. Они хвастаются дикой эффективностью (до 47% MFU на претрейне) и кучей оптимизаций для инференса, включая квантизацию до 4-бит и даже 2-бит без особых потерь в качестве. Это значит, что даже большие модели можно будет запускать на более-менее вменяемом железе.&lt;/p&gt;
  &lt;h3 id=&quot;BXyE&quot;&gt;3. Специализированный пост-трейнинг 👨🏻‍💻&lt;/h3&gt;
  &lt;p id=&quot;rbi5&quot;&gt;Базовые модели дополнительно дообучали под конкретные задачи с помощью SFT, DPO и даже собственного метода UPO. В итоге мы имеем не просто сырые pre-trained модели, а уже готовые к работе инструменты, заточенные либо под генерацию текста, либо под сложные визуально-языковые задачи.&lt;/p&gt;
  &lt;p id=&quot;7ano&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;kwoy&quot;&gt;А что по цифрам? Сравнение с конкурентами&lt;/h2&gt;
  &lt;p id=&quot;cmbN&quot;&gt;Как водится, в таких релизах без пачки бенчмарков, где новая модель всех побеждает, никуда.&lt;/p&gt;
  &lt;ul id=&quot;1lMs&quot;&gt;
    &lt;li id=&quot;ogCA&quot;&gt;&lt;strong&gt;ERNIE-4.5-300B-A47B&lt;/strong&gt; (топовая LLM) якобы обходит DeepSeek-V3-671B-A37B на большинстве тестов, особенно в знании фактов и следовании инструкциям.&lt;/li&gt;
    &lt;li id=&quot;9Mt6&quot;&gt;&lt;strong&gt;ERNIE-4.5-21B-A3B&lt;/strong&gt; (младшая LLM) показывает себя на уровне или даже лучше Qwen3-30B-A3B на задачах по математике и логике, имея при этом на 30% меньше параметров.&lt;/li&gt;
    &lt;li id=&quot;mpLX&quot;&gt;Мультимодальная &lt;strong&gt;ERNIE-4.5-VL-424B-A47B&lt;/strong&gt; показывает SOTA-результаты на сложных бенчмарках вроде MathVista и MMMU, особенно в режиме &amp;quot;thinking mode&amp;quot; (когда модель сначала рассуждает, а потом отвечает).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;S7Iz&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/23/55/235585bd-a4cd-4c7e-b307-e151960c7aa9.png&quot; width=&quot;3902&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;y2Ir&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;AazP&quot;&gt;Главный прикол: экосистема на PaddlePaddle&lt;/h2&gt;
  &lt;p id=&quot;rYmX&quot;&gt;И вот мы подходим к самому интересному. Baidu выложили не просто модели, а полный инструментарий для работы с ними.&lt;/p&gt;
  &lt;p id=&quot;FIfV&quot;&gt;&lt;strong&gt;ERNIEKit&lt;/strong&gt; — тулкит для дообучения. Поддерживает всё, что нужно: SFT, DPO (в том числе LoRA-версии), QAT и прочие страшные аббревиатуры.&lt;/p&gt;
  &lt;p id=&quot;3AoC&quot;&gt;&lt;strong&gt;FastDeploy&lt;/strong&gt; — тулкит для инференса. Позволяет развернуть модель для оффлайн-обработки или поднять API-сервер, совместимый с OpenAI.&lt;/p&gt;
  &lt;p id=&quot;DhAN&quot;&gt;Начать работу с самой маленькой моделью можно буквально в несколько команд:&lt;/p&gt;
  &lt;pre id=&quot;KQWM&quot; data-lang=&quot;python&quot;&gt;# Установка
# pip install ...

# Оффлайн-инференс
from fastdeploy import LLM, SamplingParams

prompt = &amp;quot;Напиши стих про фреймворк PaddlePaddle.&amp;quot;
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

llm = LLM(model=&amp;quot;baidu/ERNIE-4.5-0.3B-Paddle&amp;quot;, max_model_len=32768)

outputs = llm.generate(prompt, sampling_params)
print(outputs[0].text)&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Glec&quot;&gt;&lt;strong&gt;Вся эта красота работает исключительно на PaddlePaddle.&lt;/strong&gt; Хочешь нашу крутую модель — добро пожаловать в нашу экосистему. Очень хитрый, но и вполне логичный способ продвижения своего фреймворка.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;P0ZM&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;yUna&quot;&gt;Итоги: так качать или нет?&lt;/h2&gt;
  &lt;p id=&quot;hBf3&quot;&gt;Выпуск ERNIE 4.5 — это однозначно знаковое событие. Baidu не просто догнали западных конкурентов, но и предложили зрелую, полностью открытую экосистему для работы с SOTA-моделями.&lt;/p&gt;
  &lt;p id=&quot;fMv0&quot;&gt;&lt;strong&gt;Плюсы очевидны:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;jzp7&quot;&gt;
    &lt;li id=&quot;blAL&quot;&gt;Отличные заявленные характеристики.&lt;/li&gt;
    &lt;li id=&quot;P67Y&quot;&gt;Широкий выбор моделей под разные задачи и бюджеты.&lt;/li&gt;
    &lt;li id=&quot;MOVw&quot;&gt;Полный набор инструментов для fine-tuning и деплоя.&lt;/li&gt;
    &lt;li id=&quot;9vzy&quot;&gt;Лицензия Apache 2.0.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;rC2H&quot;&gt;&lt;strong&gt;Главный минус (или фича?):&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;aDgU&quot;&gt;
    &lt;li id=&quot;ZDC2&quot;&gt;Жёсткая привязка к фреймворку PaddlePaddle. Для большинства разработчиков, привыкших к PyTorch, это станет барьером.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;FRJr&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;xoAX&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&amp;quot;data:image/svg+xml,%3Csvg xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27;%3E%3Crect width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27; fill=&amp;#x27;none&amp;#x27;/%3E%3Ccircle cx=&amp;#x27;4&amp;#x27; cy=&amp;#x27;4&amp;#x27; r=&amp;#x27;1&amp;#x27; fill=&amp;#x27;rgba(255,255,255,0.04)&amp;#x27;/%3E%3C/svg%3E&amp;quot;);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;div class=&amp;quot;promo-block&amp;quot;&gt;
        &lt;div class=&amp;quot;main-card&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;main-card-header&amp;quot;&gt;
                &lt;h3&gt;&lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;&lt;/svg&gt;&lt;span&gt;Поддержать&lt;/span&gt;&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;p class=&amp;quot;link-text&amp;quot;&gt;pay.cloudtips.ru/p/3a37d9ef&lt;/p&gt;
        &lt;/div&gt;
        &lt;div class=&amp;quot;secondary-actions&amp;quot;&gt;
            &lt;div class=&amp;quot;action-item telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper telegram-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Канал в Telegram&lt;/h4&gt;
                    &lt;span&gt;t.me/pythontalk_ru&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
             &lt;div class=&amp;quot;action-item dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper dzen-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Блог на Дзен&lt;/h4&gt;
                    &lt;span&gt;dzen.ru/pythontalk&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const checkIconHTML = &amp;#x60;&lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;&lt;/svg&gt;&amp;#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&amp;#x27;.main-card-header h3&amp;#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        header.innerHTML = &amp;#x60;&lt;span class=&amp;quot;icon-check&amp;quot;&gt;${checkIconHTML}&lt;/span&gt;&lt;span&gt;Ссылка скопирована!&lt;/span&gt;&amp;#x60;;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&amp;#x27;.copy-indicator&amp;#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            const mainCard = document.querySelector(&amp;#x27;.main-card&amp;#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                if (qrContainer &amp;&amp; typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &amp;quot;#000000&amp;quot;, colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&amp;#x27;.action-item&amp;#x27;).forEach(setupItemCopyAction);
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:mojo-in-python</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/mojo-in-python?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Mojo внутри Python: убийца или лучший друг?</title><published>2025-06-27T12:36:26.491Z</published><updated>2025-06-27T13:56:56.969Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/33/03/3303a085-33eb-4dd4-b9d4-7f38cc54e227.png"></media:thumbnail><category term="prochee" label="Прочее"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/d0/32/d0325f65-b4bb-4cee-b3d0-627b13536371.jpeg&quot;&gt;Я уже не раз иронизировал на тему &quot;убийцы Python&quot; — языка Mojo, который с момента своего анонса обещал нам золотые горы и производительность в 35 000 раз выше. Что ж, похоже, лёд тронулся. Недавно создатель языка Крис Латтнер объявил, что теперь код на Mojo можно вызывать напрямую из Python.</summary><content type="html">
  &lt;h1 id=&quot;ZsG6&quot;&gt;Разбираем реальный кейс и перспективы&lt;/h1&gt;
  &lt;p id=&quot;ywxN&quot;&gt;Я уже не раз &lt;a href=&quot;https://t.me/pythontalk_ru/1298&quot; target=&quot;_blank&quot;&gt;иронизировал&lt;/a&gt; на тему &amp;quot;убийцы Python&amp;quot; — языка Mojo, который с момента своего анонса обещал нам золотые горы и производительность в 35 000 раз выше. Что ж, похоже, лёд тронулся. Недавно создатель языка Крис Латтнер объявил, что теперь код на Mojo можно вызывать напрямую из Python.&lt;/p&gt;
  &lt;figure id=&quot;ONIZ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d0/32/d0325f65-b4bb-4cee-b3d0-627b13536371.jpeg&quot; width=&quot;388&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ZW44&quot;&gt;В интернетах появился &lt;a href=&quot;https://koaning.io/posts/giving-mojo-a-spin/&quot; target=&quot;_blank&quot;&gt;отличный эксперимент&lt;/a&gt;, который наглядно показывает, что мы имеем на текущий момент: дико перспективную технологию или сырую поделку? Спойлер: и то, и другое.&lt;/p&gt;
  &lt;p id=&quot;v6d9&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;lcEr&quot;&gt;Как это работает?&lt;/h2&gt;
  &lt;p id=&quot;Sjul&quot;&gt;Первое, что радует — порог входа стал ниже. Установка теперь делается через &lt;code&gt;uv&lt;/code&gt; в одну команду, что уже прогресс по сравнению с первыми версиями.&lt;/p&gt;
  &lt;p id=&quot;xKix&quot;&gt;Чтобы создать быструю функцию для Python, нужно:&lt;/p&gt;
  &lt;ol id=&quot;yMBs&quot;&gt;
    &lt;li id=&quot;CEfm&quot;&gt;Написать её в файле &lt;code&gt;.mojo&lt;/code&gt;, обернув в специальный экспортный код.&lt;/li&gt;
    &lt;li id=&quot;Pnod&quot;&gt;В Python-скрипте импортировать специальный &lt;code&gt;max.mojo.importer&lt;/code&gt;, после чего можно импортировать свой mojo-модуль как обычный.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;w2DA&quot;&gt;Выглядит это всё ещё немного громоздко, но уже вполне реально. Но давайте к самому интересному — к тестам производительности.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;gUxN&quot;&gt;Цель: понять, можно ли использовать Mojo как замену C/Rust/Cython для ускорения &amp;quot;тяжёлых&amp;quot; вычислений в Python-проектах.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;ANm7&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Nhhq&quot;&gt;Тест №1: Факториал. Классический провал&lt;/h2&gt;
  &lt;p id=&quot;zJTt&quot;&gt;Первый тест был простым — вычисление факториала. На малых числах Mojo показал себя чуть быстрее. Но как только автор эксперимента попробовал вычислить &lt;code&gt;factorial(100)&lt;/code&gt;, Mojo вернул 0.&lt;/p&gt;
  &lt;p id=&quot;d7zT&quot;&gt;Причина понятна — &lt;strong&gt;переполнение целочисленного типа&lt;/strong&gt;. Mojo, как и многие компилируемые языки, использует типы данных фиксированного размера (например, 64-битное целое). Python же по умолчанию использует длинную арифметику, позволяя работать с целыми числами практически неограниченного размера.&lt;/p&gt;
  &lt;p id=&quot;igrt&quot;&gt;Это идеальная иллюстрация того, что Mojo — это не &amp;quot;улучшенный Python&amp;quot;. Это другой язык со своими правилами и своими, более низкоуровневыми, компромиссами. &lt;/p&gt;
  &lt;p id=&quot;2hJ2&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;cUel&quot;&gt;Тест №2: Простые числа. Неожиданный триумф&lt;/h2&gt;
  &lt;p id=&quot;uMcR&quot;&gt;Если на факториале Mojo сел в лужу, то на вычислительно сложной задаче — подсчёте простых чисел — он показал себя во всей красе. Автор написал три одинаково наивных реализации: на чистом Python, на NumPy и на Mojo.&lt;/p&gt;
  &lt;p id=&quot;qB2R&quot;&gt;Результаты для подсчёта простых чисел до 20 000:&lt;/p&gt;
  &lt;ul id=&quot;06YY&quot;&gt;
    &lt;li id=&quot;nlwm&quot;&gt;&lt;strong&gt;Чистый Python:&lt;/strong&gt; ~0.45 секунды&lt;/li&gt;
    &lt;li id=&quot;KDwE&quot;&gt;&lt;strong&gt;NumPy:&lt;/strong&gt; ~0.26 секунды&lt;/li&gt;
    &lt;li id=&quot;Fc5I&quot;&gt;&lt;strong&gt;Mojo:&lt;/strong&gt; ~0.011 секунды&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7QDw&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;PLGa&quot;&gt;Mojo оказался быстрее чистого Python примерно в 40 раз, и быстрее NumPy — в 20 раз.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;VR9K&quot;&gt;И вот это уже очень серьёзная заявка. Обогнать NumPy, который под капотом использует оптимизированный код на C, в 20 раз — это впечатляет. Особенно если учесть, что синтаксис Mojo действительно проще для изучения, чем Rust или C++.&lt;/p&gt;
  &lt;p id=&quot;7Lsz&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;PgaD&quot;&gt;Что мы имеем в сухом остатке? Как будто есть потенциал. Идея получить язык, который синтаксически близок к Python, но даёт производительность на уровне (а иногда и выше) компилируемых языков, звучит заманчиво.&lt;/p&gt;
  &lt;p id=&quot;TqMI&quot;&gt;Не можешь победить — присоединись 🤪&lt;/p&gt;
  &lt;p id=&quot;HX7a&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;gkt3&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&amp;quot;data:image/svg+xml,%3Csvg xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27;%3E%3Crect width=&amp;#x27;20&amp;#x27; height=&amp;#x27;20&amp;#x27; fill=&amp;#x27;none&amp;#x27;/%3E%3Ccircle cx=&amp;#x27;4&amp;#x27; cy=&amp;#x27;4&amp;#x27; r=&amp;#x27;1&amp;#x27; fill=&amp;#x27;rgba(255,255,255,0.04)&amp;#x27;/%3E%3C/svg%3E&amp;quot;);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;div class=&amp;quot;promo-block&amp;quot;&gt;
        &lt;div class=&amp;quot;main-card&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;main-card-header&amp;quot;&gt;
                &lt;h3&gt;&lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;&lt;/svg&gt;&lt;span&gt;Поддержать&lt;/span&gt;&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;p class=&amp;quot;link-text&amp;quot;&gt;pay.cloudtips.ru/p/3a37d9ef&lt;/p&gt;
        &lt;/div&gt;
        &lt;div class=&amp;quot;secondary-actions&amp;quot;&gt;
            &lt;div class=&amp;quot;action-item telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper telegram-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Канал в Telegram&lt;/h4&gt;
                    &lt;span&gt;t.me/pythontalk_ru&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
             &lt;div class=&amp;quot;action-item dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
                &lt;div class=&amp;quot;action-icon-wrapper dzen-bg&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;action-text&amp;quot;&gt;
                    &lt;h4&gt;Блог на Дзен&lt;/h4&gt;
                    &lt;span&gt;dzen.ru/pythontalk&lt;/span&gt;
                &lt;/div&gt;
                &lt;div class=&amp;quot;copy-indicator&amp;quot;&gt;
                    &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&amp;quot; /&gt;&lt;/svg&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const checkIconHTML = &amp;#x60;&lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;&lt;/svg&gt;&amp;#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&amp;#x27;.main-card-header h3&amp;#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        header.innerHTML = &amp;#x60;&lt;span class=&amp;quot;icon-check&amp;quot;&gt;${checkIconHTML}&lt;/span&gt;&lt;span&gt;Ссылка скопирована!&lt;/span&gt;&amp;#x60;;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&amp;#x27;.copy-indicator&amp;#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() =&gt; {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() =&gt; {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err =&gt; console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err));
                });
            }

            const mainCard = document.querySelector(&amp;#x27;.main-card&amp;#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                if (qrContainer &amp;&amp; typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &amp;quot;#000000&amp;quot;, colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&amp;#x27;.action-item&amp;#x27;).forEach(setupItemCopyAction);
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:gemma-3n-release</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/gemma-3n-release?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Gemma 3n: новый компактная модель от Google</title><published>2025-06-27T05:10:56.236Z</published><updated>2025-06-27T05:10:56.236Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/dc/24/dc249afc-09b0-489c-8ba9-e12666eec7e7.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/da/d1/dad16a6b-07f6-45dd-ae6b-772654de1811.png&quot;&gt;Gemma 3n — модель, которая фокусируется не на размере, а на эффективности и работе прямо на устройствах. Давайте разберёмся, что там под капотом и есть ли в этом реальная польза для разработчика.</summary><content type="html">
  &lt;p id=&quot;aBx6&quot;&gt;Gemma 3n — модель, которая фокусируется не на размере, а на эффективности и работе прямо на устройствах. Давайте разберёмся, что там под капотом и есть ли в этом реальная польза для разработчика.&lt;/p&gt;
  &lt;figure id=&quot;Gf9a&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/eJFJRyXEHZ0?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5gYh&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ctHV&quot;&gt;Что под капотом? Архитектура «Матрёшка»&lt;/h2&gt;
  &lt;p id=&quot;5WnI&quot;&gt;Самая интересная фишка Gemma 3n — это архитектура MatFormer (Matryoshka Transformer). Аналогия с матрёшкой тут прямая: большая модель содержит внутри себя несколько полностью функциональных моделей поменьше.&lt;/p&gt;
  &lt;figure id=&quot;e1lm&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/da/d1/dad16a6b-07f6-45dd-ae6b-772654de1811.png&quot; width=&quot;1073&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;izQc&quot;&gt;На практике это даёт разработчику две крутые возможности:&lt;/p&gt;
  &lt;ol id=&quot;I8gJ&quot;&gt;
    &lt;li id=&quot;CPoN&quot;&gt;&lt;strong&gt;Готовые модели разного размера.&lt;/strong&gt; Google сразу предлагает две версии: E4B (эффективные 4 млрд параметров) и E2B (2 млрд). E2B — это не отдельная модель, а просто «извлечённый» слой из E4B, который работает до 2 раз быстрее. Можно выбрать, что важнее: производительность или скорость.&lt;/li&gt;
    &lt;li id=&quot;EOhS&quot;&gt;&lt;strong&gt;Создание кастомных моделей.&lt;/strong&gt; С помощью техники &amp;quot;Mix-n-Match&amp;quot; можно самостоятельно «нарезать» модель нужного размера между E2B и E4B, подгоняя её под конкретные аппаратные ограничения. Это уже уровень серьёзного инженерного контроля, а не просто использование готового API.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;7sqv&quot;&gt;Gemma 3n E4B стала первой моделью &amp;lt;10B параметров, набравшей &amp;gt;1300 на LMArena. Требует всего 3ГБ памяти. Понимает текст, код, изображения, аудио и видео.&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;9w0d&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5b/2a/5b2a4602-2c55-4b1d-9bc8-a38c8365e25c.png&quot; width=&quot;1035&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gBsx&quot;&gt;Всё это дополняется технологией Per-Layer Embeddings (PLE), которая позволяет держать в быстрой памяти (VRAM) только ядро модели (2-4 млрд параметров), а остальные веса грузить из обычной оперативки.&lt;/p&gt;
  &lt;p id=&quot;8ZjO&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Vh3k&quot;&gt;Так, а для программиста что?&lt;/h2&gt;
  &lt;p id=&quot;az4O&quot;&gt;Хорошо, архитектура интересная, но в чём практическая польза?&lt;/p&gt;
  &lt;p id=&quot;HSym&quot;&gt;Во-первых, и в-главных, &lt;strong&gt;улучшения в программировании и логических задачах&lt;/strong&gt;. Во-вторых, &lt;strong&gt;полная автономность&lt;/strong&gt;. Возможность запускать мощную модель локально — это киллер-фича.&lt;/p&gt;
  &lt;ul id=&quot;oiMS&quot;&gt;
    &lt;li id=&quot;igR3&quot;&gt;&lt;strong&gt;Приватность:&lt;/strong&gt; Больше не нужно отправлять свой проприетарный или просто чувствительный код в облако какому-то дяде. Всё остаётся на вашей машине.&lt;/li&gt;
    &lt;li id=&quot;x4tb&quot;&gt;&lt;strong&gt;Работа оффлайн:&lt;/strong&gt; Можно пилить приложения, которые не зависят от интернет-соединения. Для мобильной разработки или утилит, работающих в закрытых корпоративных сетях, — это золото.&lt;/li&gt;
    &lt;li id=&quot;qOJL&quot;&gt;&lt;strong&gt;Никаких API и rate-лимитов:&lt;/strong&gt; Вы полностью контролируете модель. Никто не выставит вам внезапно счёт на тысячи долларов и не заблокирует доступ за превышение лимитов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;mfyc&quot;&gt;В-третьих, &lt;strong&gt;мультимодальность на практике&lt;/strong&gt;. Представьте себе плагин для IDE, которому можно скормить скриншот ошибки из чужого приложения, и он предложит код для её исправления. Или голосовое управление разработкой, которое работает без лагов и задержек. С локальными мультимодальными моделями это перестаёт быть фантастикой.&lt;/p&gt;
  &lt;p id=&quot;tknx&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;lK55&quot;&gt;Gemma 3n уже интегрирована в самые популярные инструменты, которые мы все используем:&lt;/p&gt;
  &lt;ul id=&quot;CuKO&quot;&gt;
    &lt;li id=&quot;P4vw&quot;&gt;&lt;strong&gt;Hugging Face Transformers:&lt;/strong&gt; качаете веса и вперёд.&lt;/li&gt;
    &lt;li id=&quot;VfK1&quot;&gt;&lt;strong&gt;llama.cpp:&lt;/strong&gt; для тех, кто любит максимальную производительность на CPU.&lt;/li&gt;
    &lt;li id=&quot;O6mw&quot;&gt;&lt;strong&gt;Ollama:&lt;/strong&gt; самый простой способ запустить модель локально одной командой.&lt;/li&gt;
    &lt;li id=&quot;5Qyc&quot;&gt;&lt;strong&gt;MLX:&lt;/strong&gt; для яблочных энтузиастов с чипами Apple Silicon.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Q7Zi&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;YlX7&quot;&gt;Google также выложила модели на &lt;a href=&quot;https://huggingface.co/collections/google/gemma-3n-685065323f5984ef315c93f4&quot; target=&quot;_blank&quot;&gt;Hugging Face&lt;/a&gt; и &lt;a href=&quot;https://www.kaggle.com/models/google/gemma-3n&quot; target=&quot;_blank&quot;&gt;Kaggle&lt;/a&gt;, а для быстрых тестов есть &lt;a href=&quot;https://aistudio.google.com/prompts/new_chat?model=gemma-3n-e4b-it&quot; target=&quot;_blank&quot;&gt;Google AI Studio&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;NLot&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;yAoD&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;main class=&amp;quot;container&amp;quot;&gt;
        &lt;div class=&amp;quot;card card-telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Канал в Telegram&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-telegram&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;div class=&amp;quot;card card-donate&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Поддержать&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
        
        &lt;div class=&amp;quot;card card-dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Блог на Дзен&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-dzen&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/main&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const qrSize = 92;
            const copiedStateHTML = &amp;#x60;
                &lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;span&gt;Скопировано&lt;/span&gt;&amp;#x60;;
            
            document.querySelectorAll(&amp;#x27;.card&amp;#x27;).forEach(card =&gt; {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                const copyButton = card.querySelector(&amp;#x27;.copy-btn&amp;#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &amp;quot;#000000&amp;quot;,
                        colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() =&gt; {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() =&gt; {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err =&gt; {
                        console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err);
                    });
                });
            });
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:mamba-it-husbands</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/mamba-it-husbands?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Конец эпохи: почему айтишники больше не самые завидные женихи России</title><published>2025-06-26T08:05:36.768Z</published><updated>2025-06-26T08:05:36.768Z</updated><category term="news" label="Новости"></category><summary type="html">Пузырь хайпа вокруг IT, раздуваемый последние несколько лет лозунгами «войти в айти за 2 месяца и получать 300к», похоже, начал сдуваться. Очередной звоночек пришёл не с рынка труда, а из сферы куда более приземлённой — с сайта знакомств. Исследование Mamba показало: образ айтишника как идеального мужа теряет свою привлекательность.</summary><content type="html">
  &lt;p id=&quot;7r38&quot;&gt;Пузырь хайпа вокруг IT, раздуваемый последние несколько лет лозунгами «войти в айти за 2 месяца и получать 300к», похоже, начал сдуваться. Очередной звоночек пришёл не с рынка труда, а из сферы куда более приземлённой — с сайта знакомств. Исследование Mamba &lt;a href=&quot;https://ria.ru/20250626/muzh-2025492124.html&quot; target=&quot;_blank&quot;&gt;показало&lt;/a&gt;: образ айтишника как идеального мужа теряет свою привлекательность.&lt;/p&gt;
  &lt;p id=&quot;v9Da&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;6Al9&quot;&gt;Падение с пьедестала: что говорят цифры&lt;/h2&gt;
  &lt;p id=&quot;1MBU&quot;&gt;Давайте посмотрим на результаты исследования, в котором приняли участие почти 3 тысячи человек. &lt;/p&gt;
  &lt;ul id=&quot;hha4&quot;&gt;
    &lt;li id=&quot;baUd&quot;&gt;&lt;strong&gt;Резкое падение:&lt;/strong&gt; Если в 2023 году 72% опрошенных женщин видели в IT-специалисте идеального кандидата в мужья, то сегодня эта цифра упала до 27%.&lt;/li&gt;
    &lt;li id=&quot;9bU7&quot;&gt;&lt;strong&gt;Новые лидеры:&lt;/strong&gt; Пальму первенства перехватили врачи (43%) и стоматологи (38%). На третьем месте — предприниматели (36%).&lt;/li&gt;
    &lt;li id=&quot;JYmc&quot;&gt;&lt;strong&gt;Причина падения:&lt;/strong&gt; Основной контраргумент — «Да, доход хороший, но слишком уж привязан к своему компьютеру». Стереотип о богатом и умном партнёре сменился образом замкнутого и социально неадаптированного человека.&lt;/li&gt;
    &lt;li id=&quot;n8w0&quot;&gt;&lt;strong&gt;Родительский (не)респект:&lt;/strong&gt; В рейтинге «зятьёв, которых одобрит мама» айтишники оказались почти на дне, обогнав только артистов и музыкантов. Лишь 3% девушек верят в гордость родителей за «зятя-компьютерщика».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;IeLf&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;zhKC&quot;&gt;Почему так произошло?&lt;/h2&gt;
  &lt;ol id=&quot;DqIn&quot;&gt;
    &lt;li id=&quot;DwCU&quot;&gt;&lt;strong&gt;Перенасыщение и девальвация.&lt;/strong&gt; Когда «айтишником» становится каждый второй выпускник онлайн-курсов, ценность самого термина размывается. Из касты избранных IT-специалисты превратились в массовую профессию, как юристы и экономисты в 2000-х.&lt;/li&gt;
    &lt;li id=&quot;FuAd&quot;&gt;&lt;strong&gt;Реальность удалёнки.&lt;/strong&gt; Пандемия и массовый переход на удалёнку сыграли злую шутку. То, что казалось преимуществом (работа из дома), обернулось социальной изоляцией. &lt;/li&gt;
    &lt;li id=&quot;ewUs&quot;&gt;&lt;strong&gt;Стабильность &amp;gt; Хайп.&lt;/strong&gt; Эпоха дикого роста прошла. Зарплаты джунов уже не поражают воображение, а конкуренция высока как никогда. На этом фоне карьера врача или стоматолога, хоть и более сложная на старте, воспринимается как более стабильная и предсказуемая в долгосрочной перспективе.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;H40x&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;main class=&amp;quot;container&amp;quot;&gt;
        &lt;div class=&amp;quot;card card-telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Канал в Telegram&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-telegram&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;div class=&amp;quot;card card-donate&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Поддержать&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
        
        &lt;div class=&amp;quot;card card-dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Блог на Дзен&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-dzen&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/main&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const qrSize = 92;
            const copiedStateHTML = &amp;#x60;
                &lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;span&gt;Скопировано&lt;/span&gt;&amp;#x60;;
            
            document.querySelectorAll(&amp;#x27;.card&amp;#x27;).forEach(card =&gt; {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                const copyButton = card.querySelector(&amp;#x27;.copy-btn&amp;#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &amp;quot;#000000&amp;quot;,
                        colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() =&gt; {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() =&gt; {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err =&gt; {
                        console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err);
                    });
                });
            });
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:gemini-cli-release</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/gemini-cli-release?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Gemini CLI: бесплатный AI-ассистент от Google, который живёт в вашем терминале</title><published>2025-06-26T04:30:04.860Z</published><updated>2025-06-26T04:30:04.860Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/39/7f/397fc4b4-6587-4059-92d7-7f5981447579.png"></media:thumbnail><category term="opensource" label="Опенсорс"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f6/9d/f69dfb8d-30ac-4cc5-b1b2-ffbdd01d3700.png&quot;&gt;На днях Google зарелизили Gemini CLI — открытого AI-агента, который интегрируется прямо в командную строку. Это инструмент для командной строки, который даёт вам прямой доступ к возможностям модели Gemini. Вы можете общаться с ним в режиме чата прямо в терминале, давать ему доступ к файлам вашего проекта, просить проанализировать код, автоматизировать рутину и многое другое.</summary><content type="html">
  &lt;p id=&quot;1XBA&quot;&gt;На днях Google &lt;a href=&quot;https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/&quot; target=&quot;_blank&quot;&gt;зарелизили&lt;/a&gt; Gemini CLI — открытого AI-агента, который интегрируется прямо в командную строку. Это инструмент для командной строки, который даёт вам прямой доступ к возможностям модели Gemini. Вы можете общаться с ним в режиме чата прямо в терминале, давать ему доступ к файлам вашего проекта, просить проанализировать код, автоматизировать рутину и многое другое.&lt;/p&gt;
  &lt;figure id=&quot;JV4p&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f6/9d/f69dfb8d-30ac-4cc5-b1b2-ffbdd01d3700.png&quot; width=&quot;2435&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;dlMa&quot;&gt;Ключевые фишки (за что стоит попробовать)&lt;/h2&gt;
  &lt;p id=&quot;oHzc&quot;&gt;Давайте по пунктам, чем эта штука хороша.&lt;/p&gt;
  &lt;h3 id=&quot;Fdsn&quot;&gt;1. Почти бесплатные и щедрые лимиты&lt;/h3&gt;
  &lt;p id=&quot;5Fac&quot;&gt;Это, пожалуй, главный вау-фактор. Просто залогинившись своим личным Google-аккаунтом, вы получаете до 1000 запросов в день и 60 запросов в минуту. Для сравнения, аналоги от OpenAI или Anthropic за такие объемы попросят денег. Для большинства повседневных задач этого хватит с головой.&lt;/p&gt;
  &lt;figure id=&quot;P3AQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cb/17/cb17cbe6-b662-4224-91f1-9a68c64f8b0f.png&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;EEot&quot;&gt;2. Работа с кодом и большим контекстом&lt;/h3&gt;
  &lt;p id=&quot;DM7I&quot;&gt;Контекст составляет 1 миллион токенов. Это значит, что вы можете «скормить» ему почти любую кодовую базу, и он сможет отвечать на вопросы по архитектуре, искать баги или предлагать рефакторинг, держа в голове весь проект.&lt;/p&gt;
  &lt;h3 id=&quot;5X4P&quot;&gt;3. Мультимодальность и взаимодействие с файлами&lt;/h3&gt;
  &lt;p id=&quot;E5TD&quot;&gt;Gemini CLI может работать не только с текстом. Ему можно дать на вход PDF-файл с документацией или даже набросок интерфейса, и он попробует сгенерировать по нему приложение. Также он умеет работать с файлами на вашем диске: конвертировать картинки, организовывать документы и т.д.&lt;/p&gt;
  &lt;h3 id=&quot;9P5N&quot;&gt;4. Интеграция с реальным миром (MCP)&lt;/h3&gt;
  &lt;p id=&quot;rjUH&quot;&gt;Это уже для продвинутых. CLI поддерживает MCP серверы. Говоря проще, это способ подключить к Gemini внешние инструменты. Google уже предоставил серверы для работы со своими генераторами медиа: Imagen (картинки), Veo (видео) и Lyria (музыка). Теоретически, можно написать свой сервер для интеграции с чем угодно, от Jira до вашего умного чайника.&lt;/p&gt;
  &lt;h3 id=&quot;zK4U&quot;&gt;5. Open Source&lt;/h3&gt;
  &lt;p id=&quot;iE5C&quot;&gt;Код проекта &lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot; target=&quot;_blank&quot;&gt;выложен&lt;/a&gt; на GitHub под лицензией Apache 2.0. Это значит, что вы можете свободно его изучать, модифицировать и использовать в своих проектах.&lt;/p&gt;
  &lt;p id=&quot;xEh8&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;GRFM&quot;&gt;Как начать?&lt;/h2&gt;
  &lt;p id=&quot;0wSE&quot;&gt;Для начала вам понадобится Node.js версии 18 или выше. &lt;/p&gt;
  &lt;p id=&quot;pH8h&quot;&gt;Самый простой способ запустить — выполнить в терминале:&lt;/p&gt;
  &lt;pre id=&quot;tnW5&quot; data-lang=&quot;bash&quot;&gt;npx https://github.com/google-gemini/gemini-cli&lt;/pre&gt;
  &lt;p id=&quot;NqdJ&quot;&gt;Либо можно установить глобально:&lt;/p&gt;
  &lt;pre id=&quot;embu&quot; data-lang=&quot;bash&quot;&gt;npm install -g @google/gemini-cli&lt;/pre&gt;
  &lt;p id=&quot;66Vz&quot;&gt;При первом запуске он попросит залогиниться через Google-аккаунт.&lt;/p&gt;
  &lt;p id=&quot;epL2&quot;&gt;Пробуем 🐸&lt;/p&gt;
  &lt;p id=&quot;zY8Y&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;yP70&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;main class=&amp;quot;container&amp;quot;&gt;
        &lt;div class=&amp;quot;card card-telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Канал в Telegram&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-telegram&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;div class=&amp;quot;card card-donate&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Поддержать&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
        
        &lt;div class=&amp;quot;card card-dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Блог на Дзен&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-dzen&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/main&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const qrSize = 92;
            const copiedStateHTML = &amp;#x60;
                &lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;span&gt;Скопировано&lt;/span&gt;&amp;#x60;;
            
            document.querySelectorAll(&amp;#x27;.card&amp;#x27;).forEach(card =&gt; {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                const copyButton = card.querySelector(&amp;#x27;.copy-btn&amp;#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &amp;quot;#000000&amp;quot;,
                        colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() =&gt; {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() =&gt; {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err =&gt; {
                        console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err);
                    });
                });
            });
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:short-python-long-run</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/short-python-long-run?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Футболка для Python-пикап-мастера 😏</title><published>2025-06-24T13:02:47.358Z</published><updated>2025-06-24T13:02:47.358Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/90/eb/90eb2f36-b685-471f-87af-67f5c8049649.png"></media:thumbnail><category term="humor" label="Смешняфка"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/dd/3b/dd3b19bd-ad4a-44fc-be4a-7d1580e53db0.jpeg&quot;&gt;Кто не понял шутку — отмечайтесь в комментах 🌝</summary><content type="html">
  &lt;figure id=&quot;TcNW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dd/3b/dd3b19bd-ad4a-44fc-be4a-7d1580e53db0.jpeg&quot; width=&quot;735&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NxeJ&quot;&gt;Кто не понял шутку — отмечайтесь в комментах 🌝&lt;/p&gt;
  &lt;figure id=&quot;aXaJ&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;main class=&amp;quot;container&amp;quot;&gt;
        &lt;div class=&amp;quot;card card-telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Канал в Telegram&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-telegram&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;div class=&amp;quot;card card-donate&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Поддержать&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
        
        &lt;div class=&amp;quot;card card-dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Блог на Дзен&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-dzen&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/main&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const qrSize = 92;
            const copiedStateHTML = &amp;#x60;
                &lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;span&gt;Скопировано&lt;/span&gt;&amp;#x60;;
            
            document.querySelectorAll(&amp;#x27;.card&amp;#x27;).forEach(card =&gt; {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                const copyButton = card.querySelector(&amp;#x27;.copy-btn&amp;#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &amp;quot;#000000&amp;quot;,
                        colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() =&gt; {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() =&gt; {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err =&gt; {
                        console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err);
                    });
                });
            });
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry><entry><id>pythontalk:machine-learning-cheatsheet</id><link rel="alternate" type="text/html" href="https://pythontalk.olegtalks.ru/machine-learning-cheatsheet?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pythontalk"></link><title>Карта машинного обучения: ваш путеводитель по алгоритмам и методам</title><published>2025-06-23T08:17:22.008Z</published><updated>2025-06-23T08:23:57.127Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/d9/08/d9080134-f057-4854-b9f8-ed209db87ac4.png"></media:thumbnail><category term="machine-learning" label="Машинное обучение"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/1e/e3/1ee3112b-e336-462c-9b5c-8e3ff873c8a4.png&quot;&gt;Постоянно вижу, как у начинающих в голове полная каша из алгоритмов, методов и терминов. Одни думают, что ML — это только нейронки, другие не отличают классификацию от кластеризации.
Чтобы навести порядок в головах, сделал вот такую шпаргалку, которая раскладывает по полочкам всё основное, что есть в машинном обучении. От классики до продвинутых штук вроде трансформеров.</summary><content type="html">
  &lt;p id=&quot;VuNN&quot;&gt;Постоянно вижу, как у начинающих в голове полная каша из алгоритмов, методов и терминов. Одни думают, что ML — это только нейронки, другие не отличают классификацию от кластеризации.&lt;br /&gt;Чтобы навести порядок в головах, сделал вот такую шпаргалку, которая раскладывает по полочкам всё основное, что есть в машинном обучении. От классики до продвинутых штук вроде трансформеров.&lt;/p&gt;
  &lt;figure id=&quot;MHXe&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1e/e3/1ee3112b-e336-462c-9b5c-8e3ff873c8a4.png&quot; width=&quot;1341&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hyAZ&quot;&gt;А чтобы эта шпаргалка всегда была под рукой, я подготовил и &lt;strong&gt;PDF-версию в высоком качестве (скачать можно &lt;a href=&quot;https://disk.yandex.ru/d/3zSU_oEigMh03A&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;)&lt;/strong&gt;. &lt;/p&gt;
  &lt;p id=&quot;QSfo&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;b2C7&quot;&gt;Три парадигмы машинного обучения&lt;/h2&gt;
  &lt;p id=&quot;TTWs&quot;&gt;Всё ML-разнообразие можно условно поделить на три большие группы. &lt;/p&gt;
  &lt;h3 id=&quot;a3Vj&quot;&gt;Обучение с учителем (Supervised Learning)&lt;/h3&gt;
  &lt;p id=&quot;KJcH&quot;&gt;Это самый понятный и распространенный подход. У нас есть размеченные данные, где для каждого объекта известен правильный ответ. Алгоритм пытается найти закономерности, чтобы потом давать верные ответы на новых, невиданных ранее данных.&lt;/p&gt;
  &lt;ul id=&quot;8lDj&quot;&gt;
    &lt;li id=&quot;vB5U&quot;&gt;&lt;strong&gt;Классификация:&lt;/strong&gt; Предсказываем категорию. Спам или не спам? Уйдет клиент или останется?&lt;/li&gt;
    &lt;ul id=&quot;QGlw&quot;&gt;
      &lt;li id=&quot;Qx3K&quot;&gt;Алгоритмы: Логистическая регрессия, k-NN, SVM, Наивный Байес.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;e24U&quot;&gt;&lt;strong&gt;Регрессия:&lt;/strong&gt; Предсказываем конкретное число. Цена на квартиру, спрос на товар, погода.&lt;/li&gt;
    &lt;ul id=&quot;8dpD&quot;&gt;
      &lt;li id=&quot;NV5j&quot;&gt;Алгоритмы: Линейная, Полиномиальная, Ridge, Lasso.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;x7PP&quot;&gt;Кстати, про &lt;strong&gt;&lt;a href=&quot;https://pythontalk.olegtalks.ru/linreg_regularization&quot; target=&quot;_blank&quot;&gt;линейную регрессию и её важные подвиды с регуляризацией (Ridge, Lasso)&lt;/a&gt;&lt;/strong&gt; я писал подробнейшую статью с примерами на Python. А про &lt;strong&gt;&lt;a href=&quot;https://pythontalk.olegtalks.ru/polynomial_regression&quot; target=&quot;_blank&quot;&gt;полиномиальную регрессию&lt;/a&gt;&lt;/strong&gt;, которая позволяет находить более сложные зависимости, — тоже есть отдельный разбор.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;JZVc&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;NPfc&quot;&gt;Обучение без учителя (Unsupervised Learning)&lt;/h3&gt;
  &lt;p id=&quot;JOL7&quot;&gt;Здесь всё сложнее и интереснее. У нас есть данные, но без правильных ответов. Алгоритм должен сам найти в них какие-то скрытые структуры, закономерности и взаимосвязи.&lt;/p&gt;
  &lt;ul id=&quot;3Bxt&quot;&gt;
    &lt;li id=&quot;dT1J&quot;&gt;&lt;strong&gt;Кластеризация:&lt;/strong&gt; Группировка похожих объектов. Например, сегментация клиентов по поведению.&lt;/li&gt;
    &lt;ul id=&quot;eoIJ&quot;&gt;
      &lt;li id=&quot;aI4L&quot;&gt;Алгоритмы: K-Means, DBSCAN, Mean-Shift.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;LoDV&quot;&gt;&lt;strong&gt;Снижение размерности:&lt;/strong&gt; Упрощение данных без потери важной информации. Когда у вас сотни признаков, а для модели нужно всего несколько.&lt;/li&gt;
    &lt;ul id=&quot;XlxO&quot;&gt;
      &lt;li id=&quot;Uylr&quot;&gt;Алгоритмы: PCA, t-SNE, LSA, LDA.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;CJ69&quot;&gt;Про то, как работает &lt;strong&gt;&lt;a href=&quot;https://pythontalk.olegtalks.ru/principal_component_analysis_python&quot; target=&quot;_blank&quot;&gt;метод главных компонент (PCA) на Python&lt;/a&gt;&lt;/strong&gt; и как он помогает извлекать максимум из данных, у меня есть отдельный гайд.&lt;/p&gt;
  &lt;/section&gt;
  &lt;ul id=&quot;wJLw&quot;&gt;
    &lt;li id=&quot;wF8D&quot;&gt;&lt;strong&gt;Поиск ассоциаций:&lt;/strong&gt; Поиск правил вида &amp;quot;если купили товар А, то часто покупают и товар Б&amp;quot;. Классика — анализ рыночной корзины.&lt;/li&gt;
    &lt;ul id=&quot;fnXi&quot;&gt;
      &lt;li id=&quot;itKD&quot;&gt;Алгоритмы: Apriori, Eclat, FP-Growth.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nOMg&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;ooJS&quot;&gt;Обучение с подкреплением (Reinforcement Learning)&lt;/h3&gt;
  &lt;p id=&quot;JbdD&quot;&gt;Тут у нас есть &amp;quot;агент&amp;quot;, который учится действовать в некой среде, получая &amp;quot;награды&amp;quot; и &amp;quot;штрафы&amp;quot; за свои действия. Его цель — максимизировать суммарную награду. На этом подходе работают автопилоты, игровые боты и торговые роботы.&lt;/p&gt;
  &lt;ul id=&quot;8Qyw&quot;&gt;
    &lt;li id=&quot;qygs&quot;&gt;Популярные алгоритмы: Q-Learning, SARSA, DQN, A3C.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;RJEr&quot;&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;OHOv&quot;&gt;Продвинутые методы&lt;/h2&gt;
  &lt;p id=&quot;rubt&quot;&gt;Когда классических подходов не хватает, в дело вступают тяжеловесы.&lt;/p&gt;
  &lt;h3 id=&quot;nCJl&quot;&gt;Ансамблевые методы&lt;/h3&gt;
  &lt;p id=&quot;ZdZX&quot;&gt;Идея проста: если объединить несколько слабых моделей, можно получить одну, но очень сильную и точную.&lt;/p&gt;
  &lt;ul id=&quot;oQER&quot;&gt;
    &lt;li id=&quot;j1WO&quot;&gt;&lt;strong&gt;Бэггинг (Bagging):&lt;/strong&gt; Модели учатся параллельно на разных подвыборках данных. Ключевой пример — Случайный лес (Random Forest).&lt;/li&gt;
    &lt;li id=&quot;C8iN&quot;&gt;&lt;strong&gt;Бустинг (Boosting):&lt;/strong&gt; Модели учатся последовательно, каждая новая исправляет ошибки предыдущей. Тут царят XGBoost, LightGBM и, конечно, CatBoost.&lt;/li&gt;
    &lt;li id=&quot;uzef&quot;&gt;&lt;strong&gt;Стекинг (Stacking):&lt;/strong&gt; Результаты работы одних моделей становятся входными данными для другой, финальной мета-модели.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;afEw&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;mCnU&quot;&gt;Нейросети и глубокое обучение (Deep Learning)&lt;/h3&gt;
  &lt;p id=&quot;LoHc&quot;&gt;Та самая область, о которой сейчас кричат из каждого утюга. Используются для самых сложных задач с неструктурированными данными — изображениями, текстом, звуком.&lt;/p&gt;
  &lt;ul id=&quot;0UbL&quot;&gt;
    &lt;li id=&quot;GlGo&quot;&gt;&lt;strong&gt;Свёрточные сети (CNN):&lt;/strong&gt; Короли компьютерного зрения.&lt;/li&gt;
    &lt;li id=&quot;9xgw&quot;&gt;&lt;strong&gt;Рекуррентные сети (RNN, LSTM):&lt;/strong&gt; Созданы для работы с последовательностями (текст, речь, временные ряды).&lt;/li&gt;
    &lt;li id=&quot;TtyR&quot;&gt;&lt;strong&gt;Трансформеры (BERT, GPT):&lt;/strong&gt; Де-факто стандарт в NLP. На них работают все современные языковые модели.&lt;/li&gt;
    &lt;li id=&quot;Ctru&quot;&gt;&lt;strong&gt;Генеративные сети (GAN, VAE):&lt;/strong&gt; Умеют создавать новый контент — от фото и музыки до текстов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Sn65&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;SOr6&quot;&gt;Эта карта — не исчерпывающий справочник, а скорее отправная точка для ваших исследований. Мир ML гораздо шире, но эти концепции — его основа.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;u5lz&quot;&gt;Надеюсь, эта структура поможет вам лучше ориентироваться в мире машинного обучения. &lt;/p&gt;
  &lt;p id=&quot;IRHx&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;XYwj&quot; class=&quot;m_custom&quot;&gt;
    &lt;iframe srcdoc=&quot;&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quot;ru&amp;quot;&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quot;UTF-8&amp;quot;&gt;
    &lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&gt;
    &lt;title&gt;Интерактивная плашка&lt;/title&gt;
    &lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&amp;quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        @import url(&amp;#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&amp;display=swap&amp;#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &amp;#x27;Inter&amp;#x27;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

    &lt;main class=&amp;quot;container&amp;quot;&gt;
        &lt;div class=&amp;quot;card card-telegram&amp;quot; data-link=&amp;quot;https://t.me/pythontalk_ru&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Канал в Telegram&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-telegram&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;div class=&amp;quot;card card-donate&amp;quot; data-link=&amp;quot;https://pay.cloudtips.ru/p/3a37d9ef&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Поддержать&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-donate&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
        
        &lt;div class=&amp;quot;card card-dzen&amp;quot; data-link=&amp;quot;https://dzen.ru/pythontalk&amp;quot;&gt;
            &lt;div class=&amp;quot;card-header&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;h3&gt;Блог на Дзен&lt;/h3&gt;
            &lt;/div&gt;
            &lt;div class=&amp;quot;qr-code-wrapper&amp;quot; id=&amp;quot;qr-dzen&amp;quot;&gt;&lt;/div&gt;
            &lt;button class=&amp;quot;copy-btn&amp;quot;&gt;
                &lt;svg class=&amp;quot;icon&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&amp;quot; /&gt;&lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&amp;quot; /&gt;&lt;/svg&gt;
                &lt;span&gt;Копировать ссылку&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;
    &lt;/main&gt;
    
    &lt;script&gt;
        document.addEventListener(&amp;#x27;DOMContentLoaded&amp;#x27;, () =&gt; {
            const qrSize = 92;
            const copiedStateHTML = &amp;#x60;
                &lt;svg class=&amp;quot;icon icon-check&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot;&gt;
                    &lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M4.5 12.75l6 6 9-13.5&amp;quot; /&gt;
                &lt;/svg&gt;
                &lt;span&gt;Скопировано&lt;/span&gt;&amp;#x60;;
            
            document.querySelectorAll(&amp;#x27;.card&amp;#x27;).forEach(card =&gt; {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&amp;#x27;.qr-code-wrapper&amp;#x27;);
                const copyButton = card.querySelector(&amp;#x27;.copy-btn&amp;#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &amp;#x27;undefined&amp;#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &amp;quot;#000000&amp;quot;,
                        colorLight: &amp;quot;#ffffff&amp;quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&amp;#x27;click&amp;#x27;, () =&gt; {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() =&gt; {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() =&gt; {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err =&gt; {
                        console.error(&amp;#x27;Ошибка копирования:&amp;#x27;, err);
                    });
                });
            });
        });
    &lt;/script&gt;
&lt;/body&gt;
&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

</content></entry></feed>