Pull to refresh
3
Максим@dugalb

Любопытный инженер. Стройка, ИИ, data engineering,

2
Rating
1
Subscribers
Send message

Rust GUI: поверхностный обзор и шпаргалка

Это не туториал, а карта‑шпаргалка, чтобы не потеряться среди десятка библиотек и быстро понять, куда копать под свою задачу.

Перед выбором любого фреймворка — откройте areweguiyet.com. Там видно зрелость, лицензию, платформы и число скачиваний. Лучшая страховка от «библиотека умерла через месяц».

Чтобы не путаться в терминах, стоит уточинить, в чем разница архитектурных подходов.

Immediate Mode (пересобирается каждый кадр). Суть: «Опиши, что должно быть на экране прямо сейчас». Не «создай кнопку и запомни её», а линейная пересборка каждый кадр: «если сейчас здесь нажали — сделай действие, и в любом случае нарисуй кнопку вот здесь».

— egui, Ply, Rust bindings dear imgui

Retained Mode (дерево виджетов в памяти). Суть: «Измени то, что уже есть». Один раз описывается структуру UI (создал кнопку, положил в layout), а потом меняются её свойства: текст, цвет, видимость. Кнопка «живёт» в памяти как объект.

— GTK и FLTK.

Reactive (реактивный режим). Суть: «UI — это функция от состояния». UI описывается как отображение некоторого состояния. Когда состояние меняется, фреймворк сам пересчитывает, что именно в UI нужно обновить.

— Azul, Cushy, Floem, Ribir, Yew, Xilem, Dioxus (использует Virtual DOM), Leptos.

Hybrid Mode (декларативный API + оптимизированный retained‑рендеринг)

— GPUI(Zed)

Теперь — к конкретным фреймворкам, которые сейчас на слуху.

Tauri. Аналог Electron. Бэкенд пишется на Rust, фронтенд — с помощью JS фреймворков (React, Vue, Svelte). Но архитектура платформы не ограничивается этим стеком. Благодаря поддержке WebAssembly можно использовать и полностью Rust-решения. Например, фреймворк Leptos компилируется в WASM-модуль и запускается во встроенном WebView Tauri.

Egui. Не требует отдельного связывания UI с моделью данных. Отрисовка интерфейса описывается в коде линейно, без колбэков и событий, что ускоряет прототипирование. При этом Egui поддерживает адаптивный рендеринг.

Iced. Кроссплатформенная библиотека, вдохновленная Elm Architecture (TEA). Типобезопасность и простота использования заявляются как ключевые принципы.Проект находится в активной разработке.

Dioxus. Фреймворк, похожий на React. Использует собственный Virtual DOM и макрос rsx!, позволяя писать HTML‑подобный код прямо внутри Rust. Dioxus Native: экспериментальный рендерер на базе WGPU, отрисовывает дерево компонентов напрямую, без использования WebView или CSS‑движка. UI‑логика и бэкенд выполняются в одном процессе, в отличие от Tauri, где фронтенд и бэкенд разделены.

Slint. Фреймворк, нацеленный на легковесность, вплоть до использования на встраиваемых устройствах. Для описания интерфейса используется собственный язык разметки (.slint), для кода доступны биндинги к Rust, C++ и JavaScript. Предлагает инструмент Live‑Preview для визуальной разработки.

Xilem. Экспериментальный фреймворк от команды Linebender на основе оригинальной архитектуры (Xilem architecture), вдохновленной Elm, SwiftUI и Flutter. Разрабатывается как преемник библиотеки Druid, работа над которой была прекращена.

Следующий шаг.

Выбор фреймворка по документации и отзывам — это половина дела. Вторая половина — попробовать его руками на минимальном примере.

Многие Rust‑фреймворки требуют системных библиотек для графики и оконных систем. Настройка «на голой» машине может занять ощутимое время и зависеть от ОС. Чтобы не разворачивать отдельное окружение под каждый вариант, удобно использовать dev‑контейнеры в VS Code. Контейнер фиксирует эту настройку один раз, и она работает одинаково на Windows, macOS и Linux (с учётом специфики Docker).

Преимущества контейнеров:

  • Изолированное, воспроизводимое окружение для каждого фреймворка.

  • Отсутствие конфликтов версий и зависимостей на основной машине.

  • Возможность переключаться между фреймворками параллельно, не теряя контекст.

проверка интерфейса
проверка интерфейса

Этот подход позволяет за пару часов собрать минимальные приложения в 3–4 фреймворках и сравнить ощущения от кода, скорость сборки, поведение окна, качество документации к старту.

Tags:
+2
Comments5

Что такое magicgui и зачем он нам?

magicgui — это Python‑библиотека для быстрой разработки простых интерфейсов. Если нужен сложный интерфейс с кастомной вёрсткой и нестандартным поведением — лучше взять PyQt‑Pyside. Когда задача обернуть функцию в окошко за 5 минут — magicgui справится.

В настоящее время magicgui поддерживает следующие бэкэнды:

API организовано на двух уровнях:

слои API magicgui
слои API magicgui

Верхний уровень — магия типов. Декораторы @magicgui, @guiclass, автоопределение виджетов по аннотациям.

Нижний уровень — ручная сборка из готовых виджетов (SpinBox, Slider, PushButton).

Примеры работы: https://pyapp‑kit.github.io/magicgui/generated_examples/

Github: https://github.com/pyapp‑kit/magicgui

Tags:
+2
Comments0

Разрываем шаблоны: строим график с разрывом всего на 65 строк

Иногда нужно скрыть часть графика используя линию обрыва, чтобы показать данные с сильно различающимися значениями. Например, когда один язык программирования популярнее остальных в разы.

Самые ходовые решения этой проблемы — разорванная ось (broken axis) или отдельные бины для аномалий. Проблема в том, что в Matplotlib нет готовой «кнопки» для создания гистограммы с разрывом. Но это легко* собирается руками на уровне нескольких осей.

Вот три рабочих подхода — выбирайте под свою задачу.

  1. Официальный пример из документации Matplotlib. 🔗 Ссылка на гайд. Отлично работает, когда выбросы зашкаливают по одной оси (X или Y). В посте разбирается как раз такой случай: гистограмма с волнистой линией обрыва.

  2. Библиотека brokenaxes делает почти всё сама. Устанавливается стандартно через pip. Вариант для тех, кто не хочет углубляться в ручную настройку.

  3. Логарифмическая шкала (часто — самый простой выход) Если выбросы строго положительные и отличаются на порядки, иногда достаточно двух строк: plt.xscale(«log») или plt.yscale(«log»). Никаких разрывов, никакой ручной работы — при этом график остаётся чистым и читаемым.

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path


def plot_broken_axis(
    labels: list[str],
    values: tuple[float, ...],
    ylim_low=(0, 12),
    ylim_high=(20, 25),
    **kwargs,
):
    """
    Строит график с разрывом оси.
    Валидирует входные данные и инкапсулирует логику отрисовки.
    """
    if len(labels) != len(values):
        raise ValueError("Длины labels и values не совпадают")

    fig, (ax_high, ax_low) = plt.subplots(
        nrows=2, figsize=(7, 4), gridspec_kw={"height_ratios": [1, 2]}
    )

    # Настройки столбцов
    kwargs.setdefault("color", "skyblue")
    kwargs.setdefault("edgecolor", "black")
    kwargs.setdefault("alpha", 0.85)

    ax_low.bar(labels, values, **kwargs)
    ax_high.bar(labels, values, **kwargs)
    fig.subplots_adjust(hspace=0.0)

    # Настройка осей
    ax_low.set_ylim(*ylim_low)
    ax_high.set_ylim(*ylim_high)
    ax_high.set_title("График с разрывом")
    ax_low.set_ylabel("Рейтинг в %")
    ax_low.set_xlabel("Языки")
    ax_high.spines["bottom"].set_visible(False)
    ax_low.spines["top"].set_visible(False)
    ax_high.tick_params(axis="x", bottom=False, labelbottom=False)
    # Рисуем разрыв оси (волна)
    offset, n_points = 0.03, 33
    pts = np.linspace(-offset, 1 + offset, n_points)
    wave = np.array([1 + (0, offset, 0, -offset)[i % 4] for i in range(n_points)])
    path = Path(list(zip(pts, wave)), [Path.MOVETO] + [Path.CURVE3] * (n_points - 1))

    opts = dict(transform=ax_low.transAxes, clip_on=False, zorder=10)
    ax_low.add_patch(mpatches.PathPatch(path, lw=6, **opts))
    ax_low.add_patch(mpatches.PathPatch(path, lw=3, edgecolor="white", **opts))
    return fig


if __name__ == "__main__":
    langs = ["Python", "C", "C++", "Asm"]
    pops = (21.8, 11.1, 8.6, 1.1)

    # Стиль xkcd
    with plt.xkcd(scale=1, length=300, randomness=30):
        plt.rcParams["font.family"] = "Comic Sans MS"

        # Вызов функции
        fig = plot_broken_axis(langs, pops)
        plt.show()

Литература:

  • Документация Matplotlib. 🔗 Ссылка на гайд

  • Bernd Klein. Numerisches Python Arbeiten mit NumPy, Matplotlib und Pandas

  • Sandro Tosi. Matplotlib for Python Developers

Tags:
+7
Comments0

Репозиторий TapXWorld/ChinaTextbook — это открытый архив официальных китайских школьных и университетских учебников в формате PDF.

Полный цикл математического образования Китая — от начальной школы (1–6 классы) до вузовских курсов: высшей математики, линейной алгебры, дискретной математики и теории вероятностей. Также доступны материалы по системе «5–4» (пятилетняя начальная и четырехлетняя средняя школа) и подборка экзаменационных задач с ответами.

Из‑за ограничений GitHub на размер файла крупные PDF разбиты на части (например, file.pdf.1 и file.pdf.2). Для их объединения в репозитории предусмотрена утилита mergePDFs‑windows‑amd64.exe, которая автоматически собирает исходный документ.

Объем скачанного репозитория > 40 Гб

$repoOwner = "TapXWorld"
$repoName = "ChinaTextbook"
$url = "https://api.github.com/repos/$repoOwner/$repoName"
$response = Invoke-RestMethod -Uri $url
$sizeInMB = $response.size / 1024
Write-Output "Размер репозитория: $sizeInMB MB"

# Размер репозитория: 42523.3662109375 MB
git count-objects -vH
count: 0
size: 0 bytes
in-pack: 4399
packs: 1
size-pack: 41.52 GiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes

# curl -s https://api.github.com/repos/TapXWorld/ChinaTextbook | jq '.size' - 43543927
# больше 40 Гб занимает pack-3a5a6dbd895b2f8703925664f6ff7e4aa62d04c3.pack
Tags:
+2
Comments5

Как читать статьи с arXiv на русском без лишних усилий

Если вы работаете с машинным обучением или исследовательскими задачами, arXiv, скорее всего, — ваш основной источник свежих идей.

Но далеко не всегда удобно читать оригинал на английском: устали, хотите быстро пробежаться по статье или просто не готовы сейчас разбираться в длинном PDF.

В этом посте — два практичных способа читать статьи с arXiv в HTML‑формате прямо в браузере и сразу переводить их на русский с помощью встроенного перевода. Никаких LLM, сторонних ботов и скачивания PDF.

Зачем вообще HTML, если есть PDF

Классический сценарий работы с arXiv выглядит так: вы открываете страницу статьи, скачиваете PDF и читаете его в отдельной программе или через встроенный viewer браузера.

У такого подхода есть несколько минусов:

  • Неудобно переводить: нужно копировать текст или использовать отдельные инструменты.

  • Плохо искать по странице: текст может быть нераспознанным или разбитым.

  • Тяжелее читать на маленьких экранах, особенно на ноутбуках и планшетах.

HTML‑версия решает эти проблемы: текст становится «живым», браузер может его переводить, а навигация и поиск по странице работают привычным образом.

Способ 1. Официальный HTML (experimental)

У части статей на arXiv есть встроенная HTML‑версия.Если она включена, справа на странице вы увидите кнопку «HTML (experimental)».

Что это даёт:

  • статья открывается как полноценная HTML‑страница;

  • формулы остаются корректными;

  • можно использовать встроенный перевод в браузере.

Ограничения:

  • HTML‑версии есть не у всех препринтов.

  • Иногда верстка «плывёт», особенно в сложных таблицах.

Способ 2. ar5iv (если HTML нет)

Если кнопки HTML (experimental) нет, можно воспользоваться сторонним сервисом ar5iv из экосистемы arXiv Labs. Он автоматически конвертирует TeX‑исходники статей в HTML.

Идея простая: вы берете обычный URL arXiv и меняете в домене букву x на 5.

Пример:

Такой простой приём заметно снижает «порог входа» в чтение статей и экономит время, особенно если вы регулярно мониторите arXiv.

Tags:
+3
Comments5

Python на флешке: как собрать портативную среду без установки

Такой вариант хорошо подходит, если нужно:

  • показать скрипт на чужом компьютере;

  • поработать на машине без прав администратора;

  • запускать Python в ограниченной среде;

  • держать рядом интерпретатор, проект и зависимости в одном месте.

На корпоративных ПК всё зависит от политики безопасности. Если запуск с USB, .exe или PowerShell ограничен, портативная сборка тоже может не стартовать.

Что нужно

Минимальный набор простой:

  • USB-накопитель;

  • Windows x64;

  • доступ в интернет, если планируете ставить дополнительные пакеты.

Скачиваем Python

Идём на официальную страницу загрузок Python и берём Windows embeddable package (64-bit) для нужной версии, например, python-3.14.4-embed-amd64.zip.
После распаковки вы получите что-то вроде этого:

F:\
└── python3.14\
    ├── python.exe
    ├── python314.dll
    ├── python314._pth
    ├── python314.zip
    └── ...

На этом этапе интерпретатор уже можно запускать прямо с флешки.

Что делает _pth

Файл python314._pth управляет тем, какие пути Python видит при запуске. По умолчанию embeddable package изолирован от системного окружения, реестра и установленных пакетов.

Если вам нужно подключить локальные библиотеки, можно прописать пути вручную:

python314.zip
.
Lib
Lib\site-packages
import site

Строка import site нужна, чтобы Python начал использовать site-механику и подхватывать дополнительные каталоги.

Как добавить pip

У embeddable package pip обычно не идёт «из коробки» как в обычной установке.
Его можно добавить вручную через официальный bootstrap-скрипт get-pip.py.

Сценарий такой:

  1. Скачайте get-pip.py.

  2. Положите его рядом с python.exe.

  3. Запустите:

PS F:\> cd ./python3.14
PS F:\python3.14> ./python get-pip.py

После этого проверьте:

./python -m pip --version
# Выведет версию pip (например, pip 26.0.1).

Ставим пакеты

Когда pip уже доступен, можно ставить нужные библиотеки:

PS F:\python3.14> ./python -m pip install numpy pandas matplotlib seaborn requests

Или сразу из requirements.txt:

PS F:\python3.14> ./python -m pip install -r requirements.txt

Запускаем проект

Чтобы не помнить длинные пути, удобно сделать run.bat в корне флешки:

@echo off
cd /d %~dp0
set PYTHON_HOME=%~dp0python3.14
set PATH=%PYTHON_HOME%;%PATH%

%PYTHON_HOME%\python.exe my_project\main.py
pause

Плюс такого подхода в том, что он не привязан к букве диска. Сегодня флешка может быть F:, а завтра D: — батник всё равно найдёт себя сам.

Типичная структура

Обычно папка на флешке выглядит так:

F:\
├── python3.14\
│   ├── python.exe
│   ├── python314.dll
│   ├── python314._pth
│   ├── python314.zip
│   └── Lib\site-packages\
├── my_project\
│   ├── main.py
│   └── requirements.txt
├── run.bat
Tags:
0
Comments2

Information

Rating
1,656-th
Location
Россия
Registered
Activity