Типа про IT
1.69K members
134 photos
4 videos
31 files
238 links
Типа про IT и вот это вот всё. Программируем программы на компьютере.
Download Telegram
to view and join the conversation
1-го января прогрессивные питонисты начали поздравлять друг друга с кончиной старого деда, то есть вроде как Python 2.7 официально откинулся и теперь заживём нормально. Слух о кончине никто толком не проверял, все опирались на цифры в Pythonclock, всеобщее ликование на грани тупости. Почему? Слухи сильно преувеличены.

1. Есть официальная инфа, что PYTHON 2 SERIES TO BE RETIRED BY APRIL 2020. Не сейчас. Весной.

2. Существует великое множество очень консервативных команд и проектов, которые принципиально ничего не трогают, потому что “оно работает норм”. Вплоть до того, что “большие” могут просто форкнуть Python 2.7 и сидеть на этом столько, сколько получится. Уже форкнули.

3. Вам не похуй? Пишите себе на Py3 спокойно, переписывайте себе легаси, обмазывайтесь тайпингами и асинхронными лупами, начинайте новые проекты на тройке. Так победим!
Klaxon — системные нотификации для OS X. Вот как на картинке. Можно из CLI, можно из Python-приложения, можно даже не в системные notifications, а через notifiers в какого-то провайдера (push, slack, email и прочие). Works like a charm, полезно прикрутить на все долгоиграющие таски с локальной машины.
8 New SQL Tools That Will Change How You Work in 2020. Сильное заявление. Проверять мы его, конечно, не будем. А ещё нашёлся вот такой ресурс, вроде как с туториалами по базам (и не только). Можно освежить в памяти какой там PostgreSQL Function Syntax, например, если лень копаться в официальной документации.
Промелькнул load generator с весьма поэтичным и остроумным названием. Не могу не поделиться. Чертовски удачный нейминг. https://github.com/klarna/ponos
Ржу чёт. Есть такой хардварный проект The Light Phone 2, очередная попытка миллениалов сделать телефон “как был в ламповых 90-х“, только в 2020-м. С целевой аудиторией всё понятно, там телефон умеет только звонить и писать СМС, зачем кому-то что-то большее? The Light Phone II has both bluetooth & wifi capabilities. There is also a headphone jack. Although there is wifi, the device will never be able to browse the internet. За какие-то жалкие $350 + shipping & handling вы получаете такой вот охренительный dumbphone.

Но смешно не здесь. Смешно, что они операционную систему LightOS сделали на форкнутом Android, а весь UI пишут на React Native (пруф).

“Across the LightOS ecosystem, we’re using 9 (or more?) programming languages, and a variety of infrastructures like Kubernetes, Serverless Node, Elixir Phoenix, WebDAV, React.js, Ember.js, Docker, CircleCI and many others. It’s a huge, sprawling system, that has been incredibly interesting to build and maintain.”

Interesting им билдить, понимаете? Я не могу блять 😂
Настало и моё время трахомудия с Докером. Казалось бы, простая и обычная задача — надо прокинуть кастомные env-переменные с настройками всякого в Docker на запуск образа (чтобы соблюсти канон The Twelve-Factor App). Docker предлагает для этого несколько ключей:
$ docker run --help
...
--env list Set environment variables
--env-file list Read in a file of environment variables
...
Но у меня харам на их использование. Я могу только так:
docker run project:latest
Даже не спрашивайте. Также, у меня есть простая последовательность запуска приложения, сначала sqitch-миграции накатить, потом уже всё остальное. Вы не поверите, но что бы я ни делал, внутри образа все мои env-переменные оказывались пустыми строками и ничего не работало. И source .env ему не то, и дублировать для sqitch полный dsn на базу тоже не хотелось… Как это делать вообще?

Я гуглил целый час, наверное, народ разной степени ебанутости попадался, всё выглядело настолько костыльно, что я бы сам у себя такой PR не принял. Короче, вот самый нормальный варик из всех. Вдруг вам тоже надо будет.
В .env. Важно, чтобы вокруг = не было пробелов, если что.
PG_DSN='postgres://user@localhost:5432/db'
В Dockerfile
CMD ["./run.sh"]
А в run.sh по итогу такое:
#!/bin/bash
export $(cat .env | xargs)
export SQITCH_TARGET=$PG_DSN
make migrations
make run


Вся магия в первой строчке, как вы поняли. Час жизни убил на эту хуйню. Обожаю.
P.S. То ли бот, то ли Телега не умеет форматировать более одного блока с кодом в одном сообщении, иначе теряются символы. Баг на баге, что за жизнь.
Помните как я недели 3 назад восторженно писал про FastAPI? Так вот, он охуенный. Всё ещё непривычно местами, но низкий порог вхождения и различные уровни переопределения всё решают. Фреймворк ведёт себя максимально предсказуемо, на предлагаемые концепции всё хорошо ложится, а что не ложится, то надо просто переписать на инъекции и тогда ложится 🙂 Форсит везде писать тайпинги, что помогает заодно документировать код. Забытое удовольствие от написания API, короче.

“Но?..” Но.

1. Хрен чё нагуглишь, компенсируется избыточно подробной документацией проекта.

2. Фреймворк не очень любит, когда опускаешься слишком низко, с его точки зрения. Не особо поощряется прямая работа с объектом request, хотя такая возможность есть, конечно.

3. Местами приходится лезть в код и догадываться как что сделать. Прикручивал Sentry намедни, думаете есть какой-то нормальный пример? Нет. Есть предложение заюзать middleware из Starlette, который deprecated, потому что Sentry SDK уже сам умеет в ASGI. Решение простое как дверь, на самом деле.

import sentry_sdk
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
from starlette.middleware import Middleware
from fastapi import FastAPI

sentry_sdk.init(dsn=SENTRY_DSN)

app = FastAPI(
**app_params,
middleware=[
Middleware(SentryAsgiMiddleware)
]
)


С тем лишь моментом, что никакого Middleware в starlette.middleware нет, он там только с 0.13.0, а в свежем FastAPI прибита версия 0.12.9. Пришлось бэкпортировать класс Middleware в проект, пока они не исправятся. Хотя, таких сюрпризов у меня больше не было.

4. Пришлось немного подумать как прикрутить Basic Auth к Swagger UI в самом приложении, нехорошо как-то всему миру светить. Но об этом лучше отдельным постом.

5. Источник вдохновения для чего-то более реального, чем примеры из документации — проект Full-Stack-FastAPI-PostgreSQL, там можно подсмотреть необходимые паттерны. Или придумай сам.

Python framework здорового человека в 2020-м, real talk.
Я тут в одном дружном чатике наткнулся на конструктивную критику Python, которая показалась мне… конструктивной. Поддерживаете оратора?

“””
Чем плох питон? Отсутствие нормальных типов, возможность внесения изменений в объекты на ходу (что означает, что isinstance начинает врать), __приватные_имена__, YOBA-функции на пару десятков именованных параметров, абсолютно неинформативные сообщения об синтаксических ошибках, тайп-хинты которые /НИЧЕГО БЛЯТЬ НЕ ДЕЛАЮТ/, считается нормой возвращать значения разных типов при разных входных аргументах, мутабельность является свойством типа, а не значения, иммутабельность проверяется в рантайме, все почти пишут /красивый/ код в угоду производительности, странное убеждение, что свободные функции, засирающие неймспейс читабельнее методов, абсолютно не масштабирующиеся list comprehension/generator expressions, однострочные блять лямбды, нет pattern matching-а или даже банального switch, встроенные списки гетерогенные, для нормальных массивов приходится юзать numpy, datatypes только в 3.7 завезли, None, None everywhere, иммутабельные строки, различие copy vs deepcopy, return обязателен даже в однострочниках, уёбищный тернарный оператор, изменение импорта всех элементов модуля на импорт только выделеных элементов меняет слово в начале, импорты могут кидать эксепшены, итераторы кидают эксепшены, отрицательные индексы.
“”” ©
Некоторые коллеги незнакомы с asyncio, никогда на нём не писали, но теперь у них есть я 🙂 В качестве учебного материала я даю https://realpython.com/async-io-python/. Там не слишком много букв, много примеров с кодом для >=3.7 и вроде как написано доступно. То есть буквально за один день можно врубиться и перестать переживать на этот счёт.
20-21 марта 2020 г. в Варшаве (Польша) пройдет 2-я Европейская конференция в области обеспечения качества ПО — «Software Quality Assurance Days. European Branch».

На конференции традиционно будет охвачен широкий спектр профессиональных вопросов в области обеспечения качества, ключевыми из которых являются:

— Методики и инструменты тестирования ПО;
— Автоматизация тестирования ПО;
— Подготовка, обучение и управление командами тестировщиков;
— Процессы обеспечения качества в компании;
— Управление тестированием и аутсорсинг;
— Совершенствование процессов тестирования и инновации.

3 потока, 37 докладов и воркшопов, много интригующих тем для QA и afterparty с пивом и музыкой ;)

По промокоду tipaproitскидка 15%!
На глаза попалась Python-библиотека tenacity, которая немедленно была использована в нескольких местах на проекте. Всё должно быть понятно без слов.

@retry(
stop=stop_after_attempt(5),
wait=wait_fixed(3),
)
def get_connection():
...
return connection


Если непонятно, то долбим установку соединения 5 раз с перерывом в 3 секунды. Если оно всё равно не устанавливается (вылетает внутри с каким-то ConnectionError, например), то не судьба. А если с первого раза всё хорошо, то хорошо.
Практически в каждом моём Python-приложении есть какой-то CLI на Click. Мне он исторически нравится больше, чем argparse, а возможностей за глаза. Кроме одной загвоздки — он не понимает корутины. А это уже почти что фатальный недостаток, тем более что весь код на asyncio.

Лечение простое. Пишем декоратор и обмазываем им нужные места.

def sync_coro(f):
@wraps(f)
def wrapper(*args, **kwargs):
return asyncio.run(f(*args, **kwargs))

return wrapper

@sync_coro
async def run_something():
db_pool = await asyncpg.create_pool(PG_DSN)
await your_coroutine(db_pool)

@click.group()
def cli():
"""CLI"""

@cli.command()
def magic_command():
"""Your magic command"""
run_something() # synchronous


Works like a charm.