Получи случайную криптовалюту за регистрацию!

Типа про IT

Логотип телеграм канала @tipaproit — Типа про IT Т
Логотип телеграм канала @tipaproit — Типа про IT
Адрес канала: @tipaproit
Категории: Технологии
Язык: Русский
Количество подписчиков: 1.24K
Описание канала:

Типа про IT и вот это вот всё. Авторский блог exclusively for Telegram.

Рейтинги и Отзывы

1.50

2 отзыва

Оценить канал tipaproit и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

0

2 звезд

1

1 звезд

1


Последние сообщения

2022-08-17 16:10:48 17-18 ноября в Лондоне состоится Modern Frontends Conference и у меня уже есть билет в кармане, поэтому ждите лонгрид с фоточками, как в старые-добрые. Программа пока не сформирована, зато среди спикеров заявлены Joel Hooks (Founder at egghead.io), Ben Lesh (RxJS Core Team Lead) и, самое главное, Sebastián Ramírez (Creator of FastAPI).

По-перше, я уже лет 5 не был ни на каких конференциях (хотя в лучшие годы ходил на все возможные, от YaC до LvivPy). По-друге, это первая большая конференция в пост-пандемийном мире и, конечно, хочется размяться. По-третє это Рамирез, ради него и идём. Но есть и по-четверте.

Закинув удочку с ссылкой на конференцию в корпоративный dev-канал на 960 человек, я получил подтверждение интереса к событию от 6 (шести) человек only. Из них двое точно не смогут приехать, потому что нет британской визы и они вряд ли успеют её получить. Остальные теперь цыганят билеты у своих линейных менеджеров.

Уже сейчас Early Bird стоит 300 фунтов, с сентября будет 400, а с октября 500. Я бы, конечно, в любом случае купил билет, но 300 фунтов для меня и 300 фунтов для огромной продуктовой компании это немного разные деньги. Это я всё к чему?

1. Никогда не сталкивался с тем, чтобы работодатель был настолько равнодушен к конференциям подобного уровня.

2. Никогда не сталкивался с тем, чтобы разработчики компании были настолько равнодушны к конференциям подобного уровня. У нас фронтенда, как и фронтендеров, дохуища, а FastAPI — корпоративный стандарт для всех новых Python Services.

3. Это что такое? Это как вообще?
418 viewsedited  13:10
Открыть/Комментировать
2022-08-15 15:33:51 ​​ Довелось давеча заняться фундаментальным рефакторингом всей кодовой базы моего пет-проджекта, потому что сделать всё хорошо изначально — это не наш метод.

Фронтенд я в итоге переписал полностью, обычное дело, а на бэкенде встал вопрос хоть какой-нибудь стандартизации, чтобы двигаться с новыми фичами дальше и не потерять контроль над ситуацией. Рефакторить так рефакторить, правильно?

И как раз в это время ко мне постучался коллега, который подкинул ссылочку на их новый REST API Standard, который вобрал в себя лучшее и при этом не раздулся до размеров JSON:API, который я, прямо скажем, недолюбливаю.

Это было вовремя. Я не поленился, прочитал всю спеку, проникся, и в итоге забрал себе часть контракта по работе с коллекциями, в частности cursor-based pagination. Потом перечитал URL Structure и задумался. А нахуя мы вообще соблюдаем REST? Зачем тянуть в новые стандарты старое соглашение, снова и снова?

GET пусть остаётся для /health и для статики, абсолютно всё решается POST-запросами, в тело которых можно аккуратно уложить любую параметризацию, а не вот это вот. Действие (action, verb) спокойно выносится в URL, пусть он сам за себя говорит. В моём случае достаточно соблюдать наименование вида /[версия]/[сущность]/[действие]/[признак], например:

/v1/damage/get/shallow — получить все т.н. “верхние маркеры”, опционально принимает набор фильтров и объект пагинации

/v1/damage/create — очевидно

/v1/airalarm/get/all — все объекты другой сущности

/v1/auth — просто действие

И так далее. POST only. Works like a charm. А вы что думаете об этом? In REST we trust или rest in peace?
496 viewsedited  12:33
Открыть/Комментировать
2022-08-01 16:44:24 ​​ MinIO — это S3 compatible object storage, который совместим с оригинальным на уровне API.

Чаще всего MinIO используют тогда, когда хочется по-честному потестировать взаимодействие с бакетами в системных тестах не мокая всё подряд. А ещё это может быть локальная зависимость для экспериментов с Hive Metastore, например, но об этом в другой раз.

Самое замечательное в MinIO, что его очень легко поднять. Вот вам готовый рецепт для Docker Compose:

minio:
image: minio/minio
container_name: minio
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=password
ports:
- 9001:9001
- 9000:9000
command: ["server", "/data", "--console-address", ":9001"]
volumes:
- minio_data:/data
mc:
depends_on:
- minio
image: minio/mc
container_name: mc
volumes:
- type: bind
source: ./minio/entrypoint.sh
target: /usr/bin/entrypoint.sh
read_only: true
environment:
- AWS_ACCESS_KEY_ID=admin
- AWS_SECRET_ACCESS_KEY=password
- AWS_REGION=us-east-1
entrypoint: ["sh", "-c", "/usr/bin/entrypoint.sh"]
volumes:
minio_data:

В entrypoint.sh своя пара строк:

#!/bin/sh

until (/usr/bin/mc config host add minio http://minio:9000 admin password) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/warehouse;
/usr/bin/mc mb minio/warehouse;
/usr/bin/mc policy set public minio/warehouse;
exit 0;

MinIO Client, если что, это вспомогательный инструмент для более лаконичных операций с хранилищами и объектами, never mind. Теперь у вас по localhost:9001 откроется симпатичный dashboard с вашим личным S3. Что с этим всем делать — вам решать :)
704 viewsedited  13:44
Открыть/Комментировать
2022-07-20 15:45:28 Многих кандидатов ломают некоторые, казалось бы, очевидные вопросы про потоки и процессы: в чём разница, как приготовить, какие есть примитивы синхронизации и зачем? При чём правильные ответы про GIL знают абсолютно все, поэтому я уже давно о нём ничего не спрашиваю. А вот написать потокобезопасный метод здесь и сейчас под силу не каждому, несмотря на сеньорство и прочие лычки.

Короче говоря, в особо тяжёлых ситуациях я даю кандидатам ссылку на https://superfastpython.com/learning-paths/ (и сам туда захаживаю), где собрано всё про concurrency в Python, с теорией и примерами, всеобъемлюще и добротно.
2.0K views12:45
Открыть/Комментировать
2022-07-15 17:40:56 Apache Parquet — это высокоэффективный бинарный column-oriented формат, который помимо самих данных содержит заодно и метаданные к ним, c типами и структурой. Считайте, что это как CSV, только сильно быстрее, занимает сильно меньше места у вас в облаке и, следовательно, дешевле в эксплуатации (иногда на порядки).

Про “паркет” хорошо знают все, кто работает с big data или ML, потому что там, на дне data-озёр, жирным слоем накапливаются мегатонны parquet-файлов, в которых большие компании хранят большие массивы данных.

Но мне кажется, что Parquet может быть полезен и в проектах поменьше, без сотен терабайт данных в S3. Где-то можно сэкономить на табличном процессинге используя Pandas (у которого, к слову, первоклассная поддержка формата), где-то можно разгрузить основную базу, ну или просто поближе познакомиться с технологией, которая лежит в основе всей современной data-движухи.

Если очень интересно и есть лишние 40 минут, посмотрите клёвый доклад от WeWork по теме.
1.0K views14:40
Открыть/Комментировать
2022-07-13 14:11:13 По долгу службы мне приходится регулярно проводить технические собеседования. И вот что характерно.

Во-первых, судя по всему, закончилась волна массового оттока специалистов из Яндекса и Мэйлру, потому что в какой-то момент у меня было с ними по три-четыре собеседования в неделю и я узнал про эти две компании больше, чем хотел. Теперь, в основном, заходят поляки, испанцы и португальцы.

Во-вторых, все те сеньоры из Яндекса, Мэйлру и Сбера — это люди с удивительной профдеформацией. Они хорошо знают что и как устроено внутри их компании, но совсем не в теме общемирового тренда на технологии. Ни у кого не было никакого опыта с K8s, Helm, AWS/GCP, например. Применительно к Python — nothing to say about FastAPI, pydantic или poetry. То есть пристреливаешься базвордами и всё в “молоко”. Зато отлично знают алгоритмы! Вот только мы их не спрашиваем. Потому все те, кто выдрочил LeetCode не проходят даже live coding, сливаясь на элементарном практическом задании.

Сидят, короче, в своём болоте годами и за все эти годы теряют собственную актуальность и волю к движению. IT — это мир Алисы. “Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее”.

Следите за рынком, иначе пиздец и точка.
1.0K viewsedited  11:11
Открыть/Комментировать
2022-06-28 18:41:06 Обычная ситуация, когда для локального прогона системных тестов поднимается связка из баз данных и прочих сервисов средствами docker compose. Перед запуском нужно “апнуть” контейнеры, дождаться их живого состояния и только потом запустить сами тесты, для чего есть bash-скрипт или makefile (или оба сразу) с каким-нибудь с потолка взятым sleep между вызовами, чтоб уж наверняка.

Я не знаю как принято решать эту проблему в прогрессивном обществе, но и sleep в минуту это как-то слишком. Поэтому мы тут у себя в команде используем простой, но эффективный wait-for-it. Выглядит примерно так:

1. docker-compose up хуё-моё
2. poetry run wait-for-it \
--parallel \
--timeout 240 \
--service postgres:5432 \
--service exasol:8563 \
-- echo "postgres and exasol are up and running"
3. poetry run pytest -s systests


Скрипт, разумеется, блокирующий, в этом весь смысл.
980 views15:41
Открыть/Комментировать
2022-06-24 17:36:56 Bloomberg разродился новым, шикарным профилировщиком для Python-приложений. Цитирую:

Memray is a memory profiler for Python. It can track memory allocations in Python code, in native extension modules, and in the Python interpreter itself. It can generate several different types of reports to help you analyze the captured memory usage data. While commonly used as a CLI tool, it can also be used as a library to perform more fine-grained profiling tasks.

Traces every function call so it can accurately represent the call stack, unlike sampling profilers.
ℭ Also handles native calls in C/C++ libraries so the entire call stack is present in the results.
Blazing fast! Profiling causes minimal slowdown in the application. Tracking native code is somewhat slower, but this can be enabled or disabled on demand.
It can generate various reports about the collected memory usage data, like flame graphs.
Works with Python threads.
Works with native-threads (e.g. C++ threads in native extensions)

Выбирайте анализатор: flame, summary, table, tree, stats или live? Будет что выводить на внешний монитор вместо скучного htop!

Но есть нюанс — Linux only, поэтому всем нам, плотно сидящим на OS X ничего не светит. Это печально.
2.4K views14:36
Открыть/Комментировать
2022-06-22 16:21:01 ​​ Бесконечно можно смотреть на три вещи: как горит огонь, как течет вода и как команда пытается выработать правильную архитектуру приложения.

Я за все эти годы в IT уже насмотрелся на горы сломанных копий, это не моя война. MVC? Onion? DDD? FP? Просто херачим как придётся? Да, ок.

Но всегда было интересно как выглядит красивое Real World Python App , вот чтобы scalable, maintainable, testable и чтобы дизайн приложения сам направлял тебя в нужную сторону. Я так и не видел хороших примеров. До весны этого года.

Пришёл к нам в команду новый software engineer, поляк, который полностью взял на себя разработку PoC нового ML-приложения и за неделю запилил нам прототип. И не просто прототип, а “это просто охуенно” прототип. В итоге мы все сошлись на том, что теперь пишем все новые приложения именно так, несмотря на мою (и не только) непереносимость ООП. Классы эти повсюду, буэ.

В основе решения — Ports & Adapters Architecture (aka Hexagonal Architecture):

Ports & Adapters Architecture
A Color Coded Guide to Ports and Adapters
Ports-And-Adapters / Hexagonal Architecture
The Clean Architecture (Ian Cooper)
More Testable Code with the Hexagonal Architecture

В качестве DI — Injector, у которого для старта откровенно слабая документация и мало примеров, но если потратить вечер и разобраться, то всё действительно просто. Плюс The Twelve Factor, не забываем.

Вот и весь секрет. Нет, на самом деле не весь, но три кита так точно.
321 views13:21
Открыть/Комментировать
2022-05-12 14:40:38 Решил тут на днях обновиться до свежего React 18, потому что в мире клиентской логики за такими вещами лучше следить, иначе окажешься в ситуации, когда переписывать надо вообще всё. Хотя, в любом случае окажешься, но не так быстро.

В новом релизе они решили поменять способ установки корневого контейнера (или как это по-рюсски?)

// Было
import { render } from ‘react-dom’;
import App from './App'
const container = document.getElementById('root')
ReactDOM.render(
,
contaner,
)

// Стало
import { createRoot } from 'react-dom/client';
import App from './App'
const container = document.getElementById('root')
const root = createRoot(container!)
root.render(

Во время рефакторинга я обновил “в том числе и это”, а потом целый час дебажил почему все actions во всём проекте стали вызываться по два раза.

А потому что upgrade notes надо читать внимательнее:

In React 18, StrictMode gets an additional behavior to ensure it’s compatible with reusable state. When Strict Mode is enabled, React intentionally double-invokes effects (mount -> unmount -> mount) for newly mounted components. А в компонентах что? useEffect, а в useEffect дёргается dispatch и API.

Такое поведение наблюдается только в development mode и только с использованием StrictMode. Они называют это фичей, которая помогает отлавливать баги и форсит использование pure functions. Я же в гробу видал такое поведение, поэтому убираем StrictMode из корня и живём нормальной жизнью root.render()

Заебали всё ломать.
347 views11:40
Открыть/Комментировать