Диджитализируй!
27.6K subscribers
459 photos
54 videos
11 files
530 links
Авторский канал Алексея Голобурдина о разработке ИТ систем и прочем важном

ПРАВИЛА — https://xn--r1a.website/t0digital/200

ЛАЙВ-КАНАЛ — @smthisgoingon

Дать много деняк — sterx@rl6.ru

Роскомнадзор: https://vk.cc/cJmDDB
Download Telegram
Статья для тех, кто боится использовать родной модуль logging в Python, не понимает его или не понимает, как настроить всё в своём проекте: https://khashtamov.com/ru/python-logging/

Накидал также небольшую демку настройки логирования в проекте — в сообщении выше.

#IT #Python #backend #codebetter
👍127🔥181
This media is not supported in your browser
VIEW IN TELEGRAM
А вот потому что читать и юзать надо было 😇

#gg #it #codebetter
👍59😁27😢3🔥21
Диджитализируй!
Типизированный_Python_для_профессиональной_разработки.pdf
Вдогоночку. Если надо указать тип для переменной, принимающей класс Animal или классы его наследники (а не экземпляр класса Animal) — можно указать так:

animal: type[Animal]

Удобно, когда функция принимает класс. Например, функция-фабрика какая-то, которая принимает на вход класс и создаёт его экземпляр.

class Animal: pass
class Cat(Animal): pass
class Dog(Animal): pass

def create_animal(animal_cls: type[Animal]) -> Animal:
print("create another animal...")
return animal_cls()

create_animal(Cat)
create_animal(Dog)


#IT #backend #python #codebetter
👍124🔥22😁2
В комментах видео по drag-and-drop подсказали лучший способ позиционирования перетаскиваемого элемента — вместо изменения координат top/left использовать CSS правило transform: translate(x,y). Плюсы такого подхода в общем случае — браузеру легче делать оптимизации производительности, легче задействовать GPU и т.п. Но реализация сложнее, во всяком случае вчера весь день мне так казалось, пока я пытался это натыкать:)

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

Вывод — если что-то долго не залетает, то вполне вероятно, что вы тупите. Стоит отдохнуть, переключиться, возможно поспать, а мозг в фоне вам поможет найти новые подходы.

Разницы в Performance в моей задаче, правда, Chrome dev tools не показал. Двигать один элемент в привязке к мыши видимо не так уж и сложно.

#IT #frontend #css #js #codebetter
👍13412🥰5🤔1
Упомянул тут в комментах книгу, которую читаю сейчас — по System design. Думаю, будет полезно многим бэкендерам. Показаны подходы к построению больших систем по нагрузке и данным. Прям хорошо. И много ссылок на бодрые статьи в интернете.

Особенно полезна книга своим чётким акцентом на строгое использование кнопочек и манипулятора мышь при написании своих собственых гуглов и твиттеров!

#books #IT #backend #codebetter
👍108🔥25😁4
Запариваетесь ли вы по красоте/длине урлов в своих веб-системах?

Которые не публичные адреса с ЧПУ для SEO, а внутрянка — там, где SEO не нужен, но люди-человеки в адресной строке браузера всё равно адрес видят?

GUID’ы, скажем, всякие смущают вас в URL, м:)?

Мы вот посовещались и решили, что GUID (один) в урле — это ок!
#IT #codebetter
👍836😢5🔥4
Надо делать хорошо, а нехорошо делать не надо!

Я сейчас в деревне и здесь по-прежнему мобильная связь работает только вне дома и на возвышенности.

Подтвердить что-то смс-кодом — проблемка. Код актуален 60 сек, за которые смс тупо не удаётся поймать иногда. И осложняется сиё мероприятие тем, что помимо смс надо ведь ещё и чтобы интернет как-то ловился, чтобы было куда этот код ввести.

И знаете что? Вот, стоя во весь рост на пеньке посреди поля с поднятым над головой телефоном и пытаясь загрузить личный кабинет оплачиваемого сервиса с постоянно отваливающимся интернетом, очень хочется, чтобы там грузилось чууууточку поменьше долбаных мегабайтов джаваскрипта:)

Professional highly complex ultra-modern frontend

Для загрузки кабинета Selectel надо грузануть 4.2 мегабайта, из которых 3.5 мегабайта JS. Angular — привеееет, дружочек-пирожочек!

Там же highly complex frontend у селектела, там стартануть без 3.5 метров скриптов никак низя. Иначе ж оно как на первом сайте в Интернет получится, недостаточно professional, слишком не modern, и вообще developer experience без этого пострадает и фронтендеры будут плак-плак и хнык-хнык, ибо их розовые IDEшные жопки на такое не подписывались!

Уууу, и што делать?!

Любой добавляемый npm пакет нужно проверить на размер в сборке через bundlephobia.com или аналоги. На каждый чих-пых добавлять плюс несколько десятков, а то и сотен килобайт чужих скриптов в сборку — может, мммм, не надо? А то в глазик тук-тук да по макушечке хрясь-хрясь:)?

А ещёёёё есть lazу loading, чтобы скрипты грузить по мере необходимости. А ещё есть SSR. А ещё есть сильно более легковесные фреймворки, чем Angular. А ещё есть островная архитектура. И ещё много-много-много всякого хорошего.

NullPointerException

Ну и, конечно, забавно наблюдать, как начинают сыпаться мобильные приложения на таком интернете. Кто молодец, добавляет плашку — пропал доступ к интернет, и мягко её убирает затем. Кто немолодец, начинает сыпать java’вовские исключения в духе NullPointerException. Альфа-банк привееееет, как дела:)?

Пургу гонишь!

Стой там на своём пеньке и не возмущайся, у нас с нормальным интернетом всё работает чётенько.

Ну так-то да.

Всем пофик. Фреймворк на фреймворке фреймворком погоняет, смазанный сотнями жирных в пень ненужных npm зависимостей. Профессиональные девелОперы профессионально девелОпят.

Хорошооо!
#IT #frontend #codebetter #javascript #tools
🔥312👍92😁43🎉4
https://youtu.be/haqLhNN5ZdY

Поговорим о возможностях аспектно-ориентированного программирования в Python, о внедрении зависимостей DI и DI-контейнерах в Python на примере punq, а также в целом о Java подходах vs Python подходах к реализации архитектуры.
Из разборов Ботаним!, 11 глава книги Чистый код, Роберт Мартин.

#youtube #IT #python #codebetter #tools #ботаним
👍69🔥126
Зззнатокам Python хитрый вопрос!

Какой тип поставить у параметра field функции print_user_field, чтобы последняя строка при проверке типа показала ошибку? Перечислять второй раз поля User — нельзя, ибо делает возможным рассинхрон имён полей в классе и отдельном их перечислении.

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

Вот так это делается на TS

А как на Python, м:)?

#IT #python #typescript #codebetter
👍38🔥5😁4
Почему перечислять второй раз поля — плохо? Потому что возможна ситуация на скриншоте ⬆️ — поле name в User переименовалось в username, а в типах параметра field осталось name. Система проверки типов не покажет ошибку при вызове print_user_name(user, "name"), а хотелось бы ошибку увидеть, так как поля name уже нет.

Почему вынести эту проверку на переданное значение field в блок try/except — плохо? Потому что это уведёт ошибку в runtime, а надо минимизировать ошибки в рантайме, ошибки в рантайме = грустящие пользователи.

Систематических способа минимизировать ошибки в рантайме я знаю два, ТТ — как Тульский Токарев, только Типизация и Тесты.

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

Можно ли обойтись без типизации? Конечно, драматически увеличив количество тестов и проверок в коде, засорив код этими проверками.

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

#python #it #codebetter
👍43🔥302