Реальный Код
25 subscribers
42 photos
6 videos
55 links
The Real Coding - твой проводник в мир разработки ПО.

Делюсь реальным опытом разработки с новичками.

Практические знания и советы по:
- Python
- Selenium
- командная строка
- C++
- много других интересностей, которые пригодятся вам в профессии
Download Telegram
спешу поделиться с вами радостью!

в совсем недавно вышедший питон 3.13 вошел мой фикс 😃 ууууууррррааааааа 🥳 несказанно счастлив и горжусь 💪

бага была зарепорчена мною еще года три назад, и пофикшена тогда же:

argparse incorrectly shows help string on a new line in case of long command string (https://github.com/python/cpython/issues/87041)

а вот и сам фикс: https://github.com/python/cpython/commit/8d3a0fecbe2edb69cf66db82f1c59601aac94651

так что вот, приложил свою руку 😎☺️

#python
🔥3👍2👎21👏1🤔1🤓1
что же касается самого релиза, то я для себя отметил следующее:

- PEP 703 – Making the Global Interpreter Lock Optional in CPython (https://peps.python.org/pep-0703/)
- вместо него есть штука Free-threaded CPython (https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython)
- A better interactive interpreter (https://docs.python.org/3/whatsnew/3.13.html#whatsnew313-better-interactive-interpreter)
- PEP 730 – Adding iOS as a supported platform (https://peps.python.org/pep-0730/)
- PEP 738 – Adding Android as a supported platform (https://peps.python.org/pep-0738/)

полный список фич и обновлений тут https://www.python.org/downloads/release/python-3130/

🐍

#python #release
👍5👎2🤔2
👻

всех с пятницей
👻2
Forwarded from Yandex Infrastructure
Не бойся! Я всего лишь баг на проде, обнаруженный в пятницу вечером. Давай смотреть друг на друга до тех пор, пока меня не заметят все остальные 💀🔥
😁4🫡4😱2
как ускорить своего бота в 10x раз 🚀

сегодня покажу одну маленькую вещь, которая может значительно ускорить вашу систему. Эта вещь – кэширование. Кэширование активно применяется на всех уровнях: от кэша процессора L1/L2/L3 и до кэширующих баз данных типа Redis

вкратце, суть такова: если есть сложные вычисления либо доступ к данным занимает длительное время, и данные какое-то время будут актуальны – можно их сохранить «поближе» к себе в более скоростном месте

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

надеюсь, тут все понятно. теперь к мааааааааленькому одному конкретному примеру, как я это сделал на практике

есть у меня бот, который показывает погоду в нескольких городах. Погоду он берет с некоторого погодного АПИ. На каждый город (допустим их 4) нужно сходить с запросом к серверу

но мы понимаем, что в течение часа погода сильно не изменится. Потому я решаю е ходить в течение часа за погодой в том же регионе, а сохранить ее у себя. ВАЖНО я бы не мог сделать такое допущение, если бы это был сервис предупреждения о бурях и другой непогоде где-нибудь в горах. Мой бот позволяет мне пренебречь этим и показывать «старую» погода в пределах часа

в Питоне есть встроенный удобные декоратор – @lru_cache (https://docs.python.org/3/library/functools.html). Однако в нем нету TTL (time to live – то есть сколько наши данные не будут «протухшими» по времени)

чтобы не городить огород самому с этим TTL вокруг стандартной функции, я легко нашел и воспользовался библиотеку с такой функциональностью – https://pypi.org/project/cachetools/

вот что получилось:


@cached(cache=TTLCache(maxsize=512, ttl=60*60))
def get_weather_at_location(latitude, longitude):
ret = requests.get(
f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}"
f"&hourly=temperature_2m,weather_code,wind_speed_10m&wind_speed_unit=ms&current_weather=true&timezone=Asia%2FNovosibirsk")

return ret.json()


теперь, сделав запрос один раз, декоратор у себя в мапяти(!) сохранят значение (да-да! прямо JSON). И в следующий раз приобращении к этой функции с теми же аргументами, не будет выполнять код функции, а вместо этого вернет уже готовый результат. При этом, чере час он очистит кэш для этих входных аргументов функции, чтобы снова сходить на сервер по АПИ и получить актуальную погоду

вот результат – 10x в скорости ответа. А это значит, что мои пользователи увидят ответ значительно быстрее 😀

вот запрос первый раз (некэшированные данные)

2024-11-04 13:57:58,786 - root - INFO - request stats (chat_id=218988127, message_id=121, time_sec=1.85)


после этого запроса они закэшировались, и то же обращение за погодой отрабатывает уже в 10 раз быстрее!


2024-11-04 13:58:02,425 - root - INFO - request stats (chat_id=218988127, message_id=123, time_sec=0.17)


и так происходит в течение часа (обратите внимание на время):

2024-11-04 14:18:35,425 - root - INFO - request stats (chat_id=218988127, message_id=133, time_sec=0.139)


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


2024-11-04 15:10:33,043 - root - INFO - request stats (chat_id=218988127, message_id=137, time_sec=1.89)


после чего – опять быстро выдаем ответ пользователю:


2024-11-04 15:10:36,277 - root - INFO - request stats (chat_id=218988127, message_id=139, time_sec=0.215)


вот такие дела… на все про все – 15 минут и 10x быстрее работа бота 😎

#python #cache #ускоряем #боты
👍3👎2🔥2🤔1🤓1
Реальный Код
Формат времени и даты Сегодня расскажу вам о стандарте представления времени и дат, который часто используется в разработке. Стандарт этот именуется ISO 8601. Почему важно знать о нем? Потому что он часто используется при разработке ПО: хранение логов, передача…
храните даты в UTC формате

хочу сегодня апнуть тему про формат дат и дать совет из заголовка

общее правило такое: данные хранятся в общепринятом стандартном формате (вообще все данные в-принципе, и даты, в частности) и переводите их в специфичный для пользователя формат на стороне клиента (мобильное приложение, фронтенд, телеграм-бот, десктоп-приложение)

то есть, еще раз: в базе лежат даты в ISO формате и только в UTC, никаких специфичных +3/+7 и прочее…

то же самое касается логов – только в UTC

объяснение простое:
* клиенты пирложения/системы могут находиться в разных часовых поясах
* пользователь может перемещаться по миру и вносить данные в приложение из разных часовых поясов
* распределенная система может иметь сервера (которые пишут в базу и в логи), которые находятся в разных территориальных локациях

во всех этих случаях, если не придерживаться правила из заголовка, в базе/логах/проектных файлах и т.д. может случиться мешанина… а оно вам надо? 😁

когда-нибудь скажете мне спасибо за этот совет 😉

#совет #дата #логи
👍5👎2🤔1🙏1
просьба

коллеги… товарищи… друзья… вкатуны и просто сочувствующие 🤗

я вот начал чуть-по-чуть опять писать сюда… и грустно видеть всего 13 подписчиков 🥺

поделитесь, пожалуйста, канальчиком с теми, кому это может быть интересно, полезно, ну или кому просто нечего делать 🤭

мне будет приятно и чуть больше мотивировать писать сюда чаще

ну и кстати, не стесняйтесь писать свои вопросы в коментах. есть вопрос у вас – он всяко может интересовать и других

#просьба
👍7🤔2👎1
накину про чистый код 😈

держите свои пуканы 🔥🔥🔥

попалась мне тут статья и видос чувака, который раскидывает, что чистый код-то чистый, но перформанс у него – как будто на 15 лет назад откинули по железу

вот статья на английском. там же есть ссылка на YouTube
https://www.computerenhance.com/p/clean-code-horrible-performance

свое мнение озвучивать не буду 😆 может как-нибудь потом отдельным постом

#холивар #чистыйКод #ссылки
🔥3🤓3😈2
Не первый раз попадается вакансия, в которой указывается подход к документации как Docs as a Code (DAAC, получается 😄).

Так вот, это именно тот подход, что я интуитивно пропагандирую и внедряю последние лет 7-8.

Ведь это очевидно (ну для меня по-крайней мере), что дока должна:

// лежать рядом с кодом, чтобы соответствовать и отражать изменения в коде (добавил фичу в фиче-бранче – обновил доку)

// быть в виде .md-файла, чтобы его легко было менять и трекать изменения

// собираться как часть продукта, например, генерации pdf как офлайн часть + встраиваться в продукт во время сборки для онлайн формата

// тестироваться ровно также, как и остальные части продукта

// скриншоты должны автоматически генериться также на этапе сборки продукта, чтобы отражать его актуальную часть (+закрываем вопрос автоматизации создания и унификации скриншотов)

#документация #daac
🔥3👍1💯1
Forwarded from Job in IT&Digital
Ведущий технический писатель (docs as code)
Удаленный формат (только по России) или гибрид (по желанию), офис в Москве.
180К — 280К

Известная российская компания, есть аккредитация.
Уникальный для России проект, которым пользуются 350К разработчиков.

Задачи:
 — разработка документации и методических материалов для нескольких продуктов: описание новой функциональности, проработка существующей документации, вся документация на русском языке;
 — исследование предметной области и сбор недостающей информации для подготовки технической документации;
 — взаимодействие с разработчиками технологии.

Подробнее
Ищет Оксана Полякова op@new.hr
👀2
лист компрехэншн

если вы хоть раз задумывались, зачем нужны list comprehension в питоне, и, может быть думали, что они быстрее, то все просто и однозначный ответ раскрыт в PEP 202 (https://peps.python.org/pep-0202/):

Rationale

List comprehensions provide a more concise way to create lists in situations where map() and filter() and/or nested loops would currently be used.


так что это всего лишь для краткости записи


[subscriber.add_mark(random.choice(['👍', '👎', '🤔'])) for subscriber in get_subscribers()]


#python #pep #comprehension
👍42🔥2🤓1👀1
хотелось написать сюда, но не знал о чем… 🤔

… и накидал скрипт, который считает статистику использования мною команд в терминале

что получилось – ниже 👇 выше ☝️

можно такое на собесах спрашивать, чтобы больше узнать о человеке: чем пользуется, какой стек 😆

#python #stats #terminal
🔥5😁2🤓2
а вот вам немножечко раскрытие меня и моих локов 🤭 (LOC, Lines f Code) и как оно менялось за год

первая картинка – 14 сентября 2023, вторая – 13 ноября 2024

видно, что питона стало сильно больше. вообще, в последнее время питон – мой основной и очень любимый инструмент

также видно, что чутка щупал плюсы и немного Го

ну и видно, что питон просто жутко вырвался вперед – более половины моего кода – на питоне!

и в целом, ±25K строк кода за год только лишь на питоне и только лишь пет- и сайд-проектов – это мощно! 💪 горжусь собой 😇

да, это только лишь мой код не включая third-party и dependencies, конечно же

ну а сделать такие же графики и запулить их к себе в ГитХаб можно с помощью утилиты https://github.com/DiPaolo/git-stats-plate-gen

да, она может не так легко завестись. может дойдут руки и сделаю веб-сервис, чтобы каждый легко и просто мог такое сделать для себя. опять же, тут есть нюанс: фишка в безопасности и приватности – утилита запускается на вашем компе и ничего никуда не отправляет! это ее главная отличительная выгодная особенность

потому – будут проблемы с запуском и буду видеть, что кому-то это нужно – доработаю ее, чтобы легко было запускать на любом компе без плясок с бубном (как мы не любим 🤣🤣)

#sourceCode #tools #loc
👏4🔥3🏆3😎1
finita la comedia

нет-нет, все хорошо, просто речь сегодня пойдет про ключевое слово (а точнее – аннотацию) final в питоне

надо сказать, что я лично узнал об этой фиче совсем недавно, тогда как в языке она присутствует с версии 3.8

ну и сразу дам ссылку на PEP – https://peps.python.org/pep-0591/

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

хотя погодите! все ли так очевидно? давайте смотреть на примере…


from typing import Final

TEST = 11
print(f'TEST before: {TEST}')

TEST += 1
print(f'TEST after: {TEST}')

TEST_CONST: Final = 12
print(f'TEST_CONST before: {TEST_CONST}')

TEST_CONST += 1
print(f'TEST_CONST after: {TEST_CONST}')


вывод:

TEST before: 11
TEST after: 12
TEST_CONST before: 12
TEST_CONST after: 13


хммммм…. но как же так?! я же сам сказал, что это константа, как мы смогли поменять ее значение??

все дело в том, что мы должны помнить, питон – нетипизированный язык! и все эти задания типов, в том числе и рассматриваемая сегодня аннотация final – это не строгое правило, а лишь подсказка (так и называется – type hint) для IDE и для утилит статического анализа

то есть, в ИДЕшке-то оно вам подсветит возможную проблему, а статический анализатор навроде ruff – ругнется и скажет, что у вас ошибка в коде. при всем при это код вы сможете запустить и он будет изменять значение вашей переменной, обозначенной как final!

так что имейте ввиду эту особенность, ну и конечно крайне рекомендую – используйте аннотацию final везде, где только возможно. этим вы еще дополнительно скажете человеку, который будет читать ваш код, что это – константа, и не предполагается ее изменение. хотя, теперь вы знаете, что если очень хочется… 😁

#python #final
🤔3😱3👀3
я завалил собес по питону 😒

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

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

такая вот у меня особенность 🤷‍♂️ да, я хорош в практике и очень плох в теории. а готовиться-зубрить… ну честно говоря не хочется, да и смысла большого не вижу

вообще, собес был ну очень простой 🤦‍♂️

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

что ваще смешно: была задача, которую я сам делал 2 недели назад 😅 в своем рабочем коде. мне там понадобилось считать длительность отработки запроса, и я прикрутил декоратор, который это делает. ну прикрутил за 20 минут и забыл

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

и тут они значит дают задачу: написать декоратор, который запускает функцию N раз и считает длительность ее выполнения. и я не смог его написать! 😩 я помнил, когда, где и для чего писал такой же декоратор, а вот вспомнить наизусть синтаксис я не смог 🤷‍♂️

короче, такие у меня дела…

это я все к чему… ну во-первых, поделиться с вами. во-вторых, вас ждут решения этих задач 😅

#python #собес
😱2😢2😭2😨1😎1
эффект Зейгарник

ну и еще дополню предыдущий пост… я сначала хотел написать, потом стер: решил, что лишнее и не по теме. и все же хочется чуть выйти за рамки только лишь кода и поделиться с вами…

не так давно узнал одну штуку – так называемый эффект Зейгарник. открыт был как раз той самой дамой с такой фамилией сто лет назад

заключается он в том, что незавершенные задачи запоминаются нашим мозгом лучше, чем завершенные

это перекликается с программами: положил данные в стек, выполнил задачу – попнул 😅 из стека. и все – забыли-едем дальше. а вот если данные из стека по какой-то причине не выбрасываются – то происходит memory leak (утечка памяти) – плохая, вредная и порой трудноуловимая штука (как раз кстати щас такую исследую в ffmpeg на определенных данных – но это другая история…)

также и в человеческом мозге: то, что актуальное – помнится хорошо. а если по какой-то причине это все начинает застревать в мозгу/памяти – начинаются проблемы с психикой…

все это еще сильно перекликается с гештальт-подходом

интересеная, в общем, штука... рекомендую ознакомиться, кому интересно

ну так вот, у себя я действие этого эффекта замечаю постоянно. это вообще мне очень свойственно – сделал и забыл. вот и на собесе то же самое случилось: две недели назад для продакшн-кода делал, сделал, забыл, то есть все – вымылось из памяти. на собесе то же самое не смог вспомнить…

в общем, возьмите на заметку 😉 не все ж нам про кодинг тут разговаривать…

#психология #неКодинг
👍3🔥32🤔1👀1
вообще, очень часто и много хочется в последнее время писать сюда. потому ждите… 😜

ну и рассказывайте про канальчик своим друзьям/знакомым/коллегам. мне будет невероятно приятно, если число подписчиков будет расти ☺️
🔥2🥰2🎉21🦄1
Скоро начну опять снимать для вас видосы на новом оборудовании. Очень надеюсь, что качество станет лучше и смотреть будет приятнее ☺️
🔥52👍2🎉2🤗2
то самое слово – корутины 😱

читаю сейчас первоисточник про корутины в питоне – PEP 492 – Coroutines with async and await syntax (https://peps.python.org/pep-0492/)

позже приду к вам с мыслями и информацией по поводу асинхронщины нашей любимой 😆 … и такой полезной 🔥

#python #pep #coroutines #async
🔥3🤓2👀2