📚 Cosmic Python: Building Clean Architectures for Welcome Failure"
Бесплатная книга, которая проведет читателя через процесс построения сложного приложения на Python с использованием современных архитектурных подходов.
Целевая аудитория: Python-разработчики, которые уже знакомы с основами языка, но хотят научиться проектировать и строить большие приложения, избегая кривой структуры проектов и "спагетти-кода".
Ключевые темы и концепции, анонсированные в предисловии:
▪ Архитектурные паттерны: В частности, акцент на чистых архитектурах (Clean Architecture), таких как Ports and Adapters (Hexagonal Architecture). Идея в том, чтобы изолировать ядро бизнес-логики от внешних зависимостей (базы данных, веб-фреймворки, внешние API).
▪ Предметно-ориентированное проектирование (Domain-Driven Design - DDD): Как моделировать сложную бизнес-логику, фокусируясь на предметной области.
▪ Событийно-ориентированная архитектура (Event-Driven Architecture - EDA): Использование событий для взаимодействия компонентов системы, что способствует слабой связанности.
▪ Разделение ответственности запросов и команд (Command Query Responsibility Segregation - CQRS): Паттерн для разделения операций чтения и записи данных, что может улучшить производительность и масштабируемость.
▪ Тестирование: Подчеркивается важность тестирования на разных уровнях (модульное, интеграционное, сквозное) как неотъемлемой части процесса разработки и поддержки архитектуры.
▪ Управление зависимостями (Dependency Injection): Техники для создания слабосвязанных компонентов.
🔗 Книга
Бесплатная книга, которая проведет читателя через процесс построения сложного приложения на Python с использованием современных архитектурных подходов.
Целевая аудитория: Python-разработчики, которые уже знакомы с основами языка, но хотят научиться проектировать и строить большие приложения, избегая кривой структуры проектов и "спагетти-кода".
Ключевые темы и концепции, анонсированные в предисловии:
▪ Архитектурные паттерны: В частности, акцент на чистых архитектурах (Clean Architecture), таких как Ports and Adapters (Hexagonal Architecture). Идея в том, чтобы изолировать ядро бизнес-логики от внешних зависимостей (базы данных, веб-фреймворки, внешние API).
▪ Предметно-ориентированное проектирование (Domain-Driven Design - DDD): Как моделировать сложную бизнес-логику, фокусируясь на предметной области.
▪ Событийно-ориентированная архитектура (Event-Driven Architecture - EDA): Использование событий для взаимодействия компонентов системы, что способствует слабой связанности.
▪ Разделение ответственности запросов и команд (Command Query Responsibility Segregation - CQRS): Паттерн для разделения операций чтения и записи данных, что может улучшить производительность и масштабируемость.
▪ Тестирование: Подчеркивается важность тестирования на разных уровнях (модульное, интеграционное, сквозное) как неотъемлемой части процесса разработки и поддержки архитектуры.
▪ Управление зависимостями (Dependency Injection): Техники для создания слабосвязанных компонентов.
🔗 Книга
Как получилась онлайн-магистратура «Фронтенд и бэкенд-разработчик» от Яндекс Практикума и ИТМО?
Мы взяли всё лучшее от классического образования, перевели в онлайн, добавили практики и выкрутили актуальность на максимум.
Приходите на день открытых дверей, чтобы узнать больше:
— Расскажем про разные траектории обучения на программе: как после выпуска стать фронтенд- или бэкенд-разработчиком.
— Обсудим уровни программы — базовый и продвинутый: чему научится студент без опыта в IT и зачем магистратура разработчику с опытом.
— Поделимся, как устроено обучение на очной онлайн-программе Яндекса и ИТМО.
— Поговорим про поступление: сроки, экзамены, документы, оплата.
Ждём вас 16 апреля в 19:00 мск.
→ Зарегистрироваться на событие
Мы взяли всё лучшее от классического образования, перевели в онлайн, добавили практики и выкрутили актуальность на максимум.
Приходите на день открытых дверей, чтобы узнать больше:
— Расскажем про разные траектории обучения на программе: как после выпуска стать фронтенд- или бэкенд-разработчиком.
— Обсудим уровни программы — базовый и продвинутый: чему научится студент без опыта в IT и зачем магистратура разработчику с опытом.
— Поделимся, как устроено обучение на очной онлайн-программе Яндекса и ИТМО.
— Поговорим про поступление: сроки, экзамены, документы, оплата.
Ждём вас 16 апреля в 19:00 мск.
→ Зарегистрироваться на событие
1. 30-Days-Of-Python — 30-дневный челлендж по основам Python.
2. Python Basics — азы Python для новичков, просто и с примерами.
3. Learn Python — справочник с кодом, пояснениями и практикой.
4. Python Guide — гайд по практикам, инструментам и сложным темам.
5. Learn Python 3 — руководство по Python 3 с практикой для начинающих.
6. Python Programming Exercises — 100+ задач по Python.
7. Coding Problems — алгоритмы и структуры данных для собесов.
8. Project-Based-Learning — Python через реальные проекты.
9. Projects — идеи проектов для прокачки навыков.
10. 100-Days-Of-ML-Code — ML на Python шаг за шагом.
11. TheAlgorithms/Python — алгоритмы и структуры данных на Python.
12. Amazing-Python-Scripts — полезные скрипты: от утилит до автоматизации.
13. Geekcomputers/Python — скрипты для сети, файлов и задач.
14. Materials — код и проекты от Real Python.
15. Awesome Python — топ фреймворков, библиотек и ресурсов.
16. 30-Seconds-of-Python — короткие сниппеты для быстрых решений.
17. Python Reference — скрипты, туториалы и лайфхаки.
#python #github #learning
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🗂️ Ballista — распределённый движок запросов, построенный на базе Apache DataFusion. Инструмент позволяет параллельно выполнять запросы на множестве узлов, сохраняя совместимость с существующими SQL-запросами, включая сложные JOIN, подзапросы и CTE.
Развёртывание упрощено благодаря Docker-образам и поддержке Kubernetes, а встроенные бенчмарки показывают, что Ballista уже способна конкурировать с Spark по скорости обработки TPC-H-подобных запросов.
🤖 GitHub
@pythonl
Развёртывание упрощено благодаря Docker-образам и поддержке Kubernetes, а встроенные бенчмарки показывают, что Ballista уже способна конкурировать с Spark по скорости обработки TPC-H-подобных запросов.
🤖 GitHub
@pythonl
Последний шанс попасть на ключевое ИТ-событие весны — Data Fusion 2025!
Уже 16–17 апреля в Москве состоится одна из крупнейших конференций по анализу данных и ИИ. Если вы еще не зарегистрировались — поторопитесь!
Data Fusion 2025 — это не просто конференция, а место, где ежегодно собираются разработчики, аналитики, инженеры данных, исследователи, бизнес и госструктуры, чтобы обсудить, как ИИ и данные меняют индустрию.
Что в программе?
✔️ 70+ сессий — от ML-инфраструктуры до внедрения генеративных моделей
✔️ 250+ экспертов — разработчики, архитекторы, лидеры компаний и науки
✔️ Тренды и инсайты этого года — новые подходы к DataOps и управлению качеством данных
✔️ Кейсы от топовых ИТ-компаний — только актуальные и проверенные решения
📌Москва, технологический кластер «Ломоносов», 16-17 апреля.
Не откладывайте на потом, регистрирация скоро закроется 💣 — https://data-fusion.ru/. Участие бесплатное!
—
*ML — машинное обучение
*DataOps — методология разработки и предоставления данных
Уже 16–17 апреля в Москве состоится одна из крупнейших конференций по анализу данных и ИИ. Если вы еще не зарегистрировались — поторопитесь!
Data Fusion 2025 — это не просто конференция, а место, где ежегодно собираются разработчики, аналитики, инженеры данных, исследователи, бизнес и госструктуры, чтобы обсудить, как ИИ и данные меняют индустрию.
Что в программе?
✔️ 70+ сессий — от ML-инфраструктуры до внедрения генеративных моделей
✔️ 250+ экспертов — разработчики, архитекторы, лидеры компаний и науки
✔️ Тренды и инсайты этого года — новые подходы к DataOps и управлению качеством данных
✔️ Кейсы от топовых ИТ-компаний — только актуальные и проверенные решения
📌Москва, технологический кластер «Ломоносов», 16-17 апреля.
Не откладывайте на потом, регистрирация скоро закроется 💣 — https://data-fusion.ru/. Участие бесплатное!
—
*ML — машинное обучение
*DataOps — методология разработки и предоставления данных
Инструмент даёт возможность фиксировать любые операции с файлами и директориями (создание, удаление, модификация, перемещение) и поддерживает работу в средах Linux, macOS и Windows
Библиотека будет особенно полезна в таких случаях, как:
▪ автоматический перезапуск серверов при обновлениях файлов
▪ обработка вновь загружаемых файлов в заданную директорию
▪ синхронизация содержимого папок
▪ создание механизмов резервного копирования, оперативно реагирующих на изменения
🔗 Watchdog
🔗 Документация
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
Он основан на системе LangGraph, использует анализ кода, документации и сигналов из сообщества, чтобы отфильтровывать малоизвестные, но перспективные проекты.
Ключевые возможности:
▪ Семантическая проверка: ищет не просто по ключевым словам, а «понимает» содержание.
▪ Многогранный анализ: учитывает не только код, но и документацию, активность и отзывы сообщества.
▪ GitHub-интеграция: фокусируется на данном экосистемном источнике, упрощая отбор качественных проектов.
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
Надоело переключаться между SQL и pandas?
Ibis — это библиотека, которая объединяет лучшее из двух миров: SQL-запросы и Python-пайплайны в одном коде.
📦 Установка (с DuckDB и примерами):
bash pip install 'ibis-framework[duckdb,examples]'
🔍 Пример:
import ibis
penguins = ibis.examples.penguins.fetch()
# SQL внутри Python
res = penguins.sql(\"""
SELECT species, island, count(*) AS count
FROM penguins GROUP BY 1, 2
\""")
# Python-стиль фильтрации и сортировки
res.order_by("count")
┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
┃ species ┃ island ┃ count ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━┩
│ string │ string │ int64 │
├───────────┼───────────┼───────┤
│ Adelie │ Biscoe │ 44 │
│ Adelie │ Torgersen │ 52 │
│ Adelie │ Dream │ 56 │
│ Chinstrap │ Dream │ 68 │
│ Gentoo │ Biscoe │ 124 │
└───────────┴───────────┴───────┘
📌 Что умеет Ibis: — SQL-прослойка прямо по датафреймам
— Один и тот же код работает с DuckDB, PostgreSQL, BigQuery, SQLite и др.
— Унифицированный синтаксис независимо от движка
— Отлично вписывается в data science-пайплайны
📊 Где пригодится:
— Аналитика
— Дашборды
— EDA и быстрые прототипы
— Интеграция SQL в ноутбуках без боли.
Совместим с Jupyter, Airflow, и всей питоновской экосистемой.
🔗 Подробнее
🔗 Github
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🗣 OuteTTS 1.0 — это современный open-source инструмент для синтеза речи (Text-to-Speech), который делает акцент на высоком качестве озвучки, клонировании голоса и поддержке множества языков. Основные особенности:
🔊 Ключевые возможности:
Высокая производительность:
Способен генерировать аудио до 42 секунд (~8192 токена) за один прогон.
Однако для наилучших результатов рекомендуется ограничиваться ~7000 токенами.
- Поддержка клонирования голоса:
Использует референсный голос (speaker reference) длиной, например, 10 секунд. В таком случае контекст для синтеза сокращается: доступно около 32 секунд активного контента (из 42).
- 20 языков:
Поддерживает озвучку на 20 различных языках, что делает его универсальным решением для мультиязычных проектов.
🛠️ Под капотом:
Хотя подробностей о модели в описании немного, из GitHub-репозитория следует, что:
Используются современные архитектуры трансформеров для TTS.
Поддерживается реалистичное клонрование голоса по короткому фрагменту.
Скорость генерации и качество аудио находятся на уровне лучших TTS-систем с открытым кодом.
Установка:
📥 Ссылка на репозиторий
@pythonl
🔊 Ключевые возможности:
Высокая производительность:
Способен генерировать аудио до 42 секунд (~8192 токена) за один прогон.
Однако для наилучших результатов рекомендуется ограничиваться ~7000 токенами.
- Поддержка клонирования голоса:
Использует референсный голос (speaker reference) длиной, например, 10 секунд. В таком случае контекст для синтеза сокращается: доступно около 32 секунд активного контента (из 42).
- 20 языков:
Поддерживает озвучку на 20 различных языках, что делает его универсальным решением для мультиязычных проектов.
🛠️ Под капотом:
Хотя подробностей о модели в описании немного, из GitHub-репозитория следует, что:
Используются современные архитектуры трансформеров для TTS.
Поддерживается реалистичное клонрование голоса по короткому фрагменту.
Скорость генерации и качество аудио находятся на уровне лучших TTS-систем с открытым кодом.
Установка:
git clone https://github.com/edwko/OuteTTS.git
cd OuteTTS
pip install -r requirements.txt
python
from outetts import OuteTTS
tts = OuteTTS(
reference_speaker_path="reference_audio/igor_voice.wav",
language="ru" # поддерживаются и другие языки, например: "en", "ja"
)
text = "Привет, Python разработчик! Я твой кастомный голосовой ассистент."
audio = tts.generate(text)
with open("output.wav", "wb") as f:
f.write(audio)
📥 Ссылка на репозиторий
@pythonl
Инженеры и любители работать с железом, отмечаем даты: 25 и 26 апреля в Москве пройдет Repair Cafe.
Когда-то Яндекс начинался с Поиска, а сегодня в компании полный in-house цикл производства железа: роботы-доставщики, автономный транспорт, умные устройства для дома и многое другое. И для тех, кто разделяет этот инженерный дух и не боится пробовать и создавать, Яндекс проводит Repair Cafe.
Оба дня будет работать мастерская — сердце всего мероприятия. Место для тех, кто хочет припаять контакты, починить наушники или разобрать проигрыватель под чутким присмотром опытных наставников. Там же будет доступно целое меню паяльников и нужных запчастей. А любителей ретро-железа ждет починка культового ПК «Ленинград», который выпускался еще в конце 80-х годов.
Кроме того, можно послушать доклады, где спикеры поговорят про неочевидные особенности термодизайна серверов и расскажут, как им удалось сделать устройство для чтения ДНК напильником.
Зарегистрироваться и ознакомиться с программой можно здесь. Прием заявок открыт до 16 апреля.
Когда-то Яндекс начинался с Поиска, а сегодня в компании полный in-house цикл производства железа: роботы-доставщики, автономный транспорт, умные устройства для дома и многое другое. И для тех, кто разделяет этот инженерный дух и не боится пробовать и создавать, Яндекс проводит Repair Cafe.
Оба дня будет работать мастерская — сердце всего мероприятия. Место для тех, кто хочет припаять контакты, починить наушники или разобрать проигрыватель под чутким присмотром опытных наставников. Там же будет доступно целое меню паяльников и нужных запчастей. А любителей ретро-железа ждет починка культового ПК «Ленинград», который выпускался еще в конце 80-х годов.
Кроме того, можно послушать доклады, где спикеры поговорят про неочевидные особенности термодизайна серверов и расскажут, как им удалось сделать устройство для чтения ДНК напильником.
Зарегистрироваться и ознакомиться с программой можно здесь. Прием заявок открыт до 16 апреля.
🔌 python-kasa — управление умными устройствами TP-Link из Python.
Если у вас есть умные розетки, лампы или другие устройства TP-Link и вы хотели бы автоматизировать их через Python, обратите внимание на эту библиотеку. С её помощью можно легко включать/выключать устройства, проверять их статус и даже управлять через командную строку. Поддерживаются как модели Kasa, так и Tapo, включая розетки, выключатели, лампы и даже камеры.
🤖 GitHub
@pythonl
Если у вас есть умные розетки, лампы или другие устройства TP-Link и вы хотели бы автоматизировать их через Python, обратите внимание на эту библиотеку. С её помощью можно легко включать/выключать устройства, проверять их статус и даже управлять через командную строку. Поддерживаются как модели Kasa, так и Tapo, включая розетки, выключатели, лампы и даже камеры.
🤖 GitHub
@pythonl
Создание собственной игры в духе легендарного Super Mario Bros — это отличный способ прокачать навыки программирования, погрузиться в основы геймдева и просто повеселиться.
Гайд по разработке простой платформенной игры с нуля Python, используя библиотеку Pygame.
📌 Гайд
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Летняя школа бэкенда Яндекса открыла набор!
Хочешь провести лето с пользой, развивая реальные сервисы в команде с профи? Это твой шанс!
Если ты:
• Уверенно пишешь на Python, Java или C++
• Понимаешь основы алгоритмов и структур данных
— подавай заявку в Летнюю школу бэкенд‑разработки Яндекса.
🗓 Формат обучения:
• 2 июня – 27 июля — онлайн-лекции и практика
• 28 июля – 24 августа — работа над проектами (онлайн или офлайн)
💡 Что тебя ждёт:
• Реальные задачи и работа в фулстек-команде
• Наставничество от инженеров Яндекса
• Возможность получить офер: >50% выпускников становятся стажёрами или сотрудниками компании
• Нетворкинг, лекторий и крутая атмосфера
📍Участие бесплатное.
🕓 Заявки принимаются до 27 апреля. Не упусти!
🔗 Подробнее
#backend #летняяшкола #яндекс #стажировка #разработка #python #java #cplusplus
Хочешь провести лето с пользой, развивая реальные сервисы в команде с профи? Это твой шанс!
Если ты:
• Уверенно пишешь на Python, Java или C++
• Понимаешь основы алгоритмов и структур данных
— подавай заявку в Летнюю школу бэкенд‑разработки Яндекса.
🗓 Формат обучения:
• 2 июня – 27 июля — онлайн-лекции и практика
• 28 июля – 24 августа — работа над проектами (онлайн или офлайн)
💡 Что тебя ждёт:
• Реальные задачи и работа в фулстек-команде
• Наставничество от инженеров Яндекса
• Возможность получить офер: >50% выпускников становятся стажёрами или сотрудниками компании
• Нетворкинг, лекторий и крутая атмосфера
📍Участие бесплатное.
🕓 Заявки принимаются до 27 апреля. Не упусти!
🔗 Подробнее
#backend #летняяшкола #яндекс #стажировка #разработка #python #java #cplusplus
🚀 Как Duolingo ускорил микросервисы на 40% с помощью асинхронного Python 🐍⚡
Duolingo рассказали, как им удалось значительно повысить производительность своих Python-сервисов, переведя их на
💸 Мотивация: производительность и снижение затрат
Duolingo работает с большим количеством микросервисов, обрабатывающих огромные объёмы трафика. Несмотря на высокую нагрузку, многие их Python-сервисы простаивали в ожидании I/O — например, сетевых запросов или операций с базой данных. Это означало неэффективное использование CPU, а значит — деньги на облачный хостинг тратились зря.
Асинхронный код — способ “переключаться” между задачами во время ожидания, используя CPU с большей отдачей. Именно это стало главной мотивацией: не “просто быть async”, а снизить расходы.
⚙️ Как проходила миграция
Процесс был постепенным и продуманным. Ниже ключевые шаги:
▪ Переход не “всё или ничего”
Команда не бросалась переписывать весь сервис с нуля. Они начали с конвертации отдельных маршрутов (routes) на async def, добавляя поддержку асинхронности по частям.
▪ Инструменты постепенно адаптировали
Библиотеки и инструменты внутри компании пришлось обновить:
▪ свой HTTP-клиент переписали под aiohttp,
▪ систему аутентификации сделали совместимой с async-контекстами,
▪ логирование, трассировка и метрики обновили под async-архитектуру.
▪ Тесты и инфраструктура
Асинхронные изменения требовали пересмотра тестов. Они внедрили поддержку pytest-asyncio и переосмыслили подход к мокам и фикстурам.
▪ Запуск в проде — поэтапно
Сначала маршруты работали в синхронном режиме. Потом их перевели в async-режим и замерили разницу. Так удалось отловить “узкие места” до массового внедрения.
📈 Результаты: +40% производительности на инстанс
▪ У каждого экземпляра микросервиса CPU начал использоваться эффективнее.
▪ Снизилось среднее время ответа (latency).
▪ Уменьшилось количество необходимых инстансов — экономия в $$$.
▪ Код стал удобнее масштабировать и поддерживать в I/O-интенсивной среде.
Пока один запрос “ждёт”, процессор может выполнять другие задачи.
🔍 Выводы
Duolingo подчёркивает:
асинхронность не нужна “просто потому что модно”.
Но если у вас сервис с большим числом I/O-операций и важна производительность — async Python может дать реальный прирост и экономию.
➡ Оригинальный пост
@pythonl
Duolingo рассказали, как им удалось значительно повысить производительность своих Python-сервисов, переведя их на
async/await
, и сделали это не ради хайпа, а ради экономии.💸 Мотивация: производительность и снижение затрат
Duolingo работает с большим количеством микросервисов, обрабатывающих огромные объёмы трафика. Несмотря на высокую нагрузку, многие их Python-сервисы простаивали в ожидании I/O — например, сетевых запросов или операций с базой данных. Это означало неэффективное использование CPU, а значит — деньги на облачный хостинг тратились зря.
Асинхронный код — способ “переключаться” между задачами во время ожидания, используя CPU с большей отдачей. Именно это стало главной мотивацией: не “просто быть async”, а снизить расходы.
⚙️ Как проходила миграция
Процесс был постепенным и продуманным. Ниже ключевые шаги:
▪ Переход не “всё или ничего”
Команда не бросалась переписывать весь сервис с нуля. Они начали с конвертации отдельных маршрутов (routes) на async def, добавляя поддержку асинхронности по частям.
▪ Инструменты постепенно адаптировали
Библиотеки и инструменты внутри компании пришлось обновить:
▪ свой HTTP-клиент переписали под aiohttp,
▪ систему аутентификации сделали совместимой с async-контекстами,
▪ логирование, трассировка и метрики обновили под async-архитектуру.
▪ Тесты и инфраструктура
Асинхронные изменения требовали пересмотра тестов. Они внедрили поддержку pytest-asyncio и переосмыслили подход к мокам и фикстурам.
▪ Запуск в проде — поэтапно
Сначала маршруты работали в синхронном режиме. Потом их перевели в async-режим и замерили разницу. Так удалось отловить “узкие места” до массового внедрения.
📈 Результаты: +40% производительности на инстанс
▪ У каждого экземпляра микросервиса CPU начал использоваться эффективнее.
▪ Снизилось среднее время ответа (latency).
▪ Уменьшилось количество необходимых инстансов — экономия в $$$.
▪ Код стал удобнее масштабировать и поддерживать в I/O-интенсивной среде.
Пока один запрос “ждёт”, процессор может выполнять другие задачи.
🔍 Выводы
Duolingo подчёркивает:
асинхронность не нужна “просто потому что модно”.
Но если у вас сервис с большим числом I/O-операций и важна производительность — async Python может дать реальный прирост и экономию.
➡ Оригинальный пост
@pythonl
🚀 Автоматизируй Docker для Python за 1 команду с Python
📦 Dockerpyze — мощный опенсорс-инструмент, который превращает любой Python-проект на uv или poetry в Docker-образ без ручной возни.
💡 Просто добавь -
🔧 Поддерживает:
✅ PEP-621
✅ uv и poetry
✅ кастомные переменные, порты и зависимости
✅ CI/CD (в т.ч. GitHub Actions)
🔥 Подходит для быстрой упаковки ML-сервисов, REST API, CLI-инструментов и всего, что крутится на Python.
▪ Github
#python #docker #poetry #uv #devtools #opensource #cli
@pythonl
📦 Dockerpyze — мощный опенсорс-инструмент, который превращает любой Python-проект на uv или poetry в Docker-образ без ручной возни.
💡 Просто добавь -
[tool.dpy]
в pyproject.toml
, укажи entrypoint
— и собирай образы одной командой. Без Dockerfile, без боли.🔧 Поддерживает:
✅ PEP-621
✅ uv и poetry
✅ кастомные переменные, порты и зависимости
✅ CI/CD (в т.ч. GitHub Actions)
🔥 Подходит для быстрой упаковки ML-сервисов, REST API, CLI-инструментов и всего, что крутится на Python.
▪ Github
#python #docker #poetry #uv #devtools #opensource #cli
@pythonl