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

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

Практические знания и советы по:
- Python
- Selenium
- командная строка
- C++
- много других интересностей, которые пригодятся вам в профессии
Download Telegram
Очень хороший текст про так называемый искусственный интеллект и пиар/хайп вокруг него. Прям очень точно описано. Советую почитать, чтобы избавиться от иллюзий и создаваемого вокруг ИИ/ML/AI/ChatGPT флёра всезнайки и всемогуча, знающего все и способного решить все проблемы

#искусственныйИнтеллект #статья #полезно
👍1👎1🤔1
Forwarded from Точка сборки
Искусственного интеллекта не существует.

Точнее, существует такой бренд, темка, которую активно форсят уж больше 10 лет (но были заходы и ранее). Но то, что сегодня пытаются впарить под этим брендом — интеллектом не является. С таким же успехом можно называть искусственным интеллектом 1С-Бухгалтерию или Яндекс.Навигатор.

Постараюсь объяснить на пальцах, что понимается под машинным обучением и нейросетями.

Это алгоритм. Как и любой алгоритм, он справляется (худо-бедно) с каким-то классом задач, но по определению не может решить ЛЮБУЮ задачу. Нейросеть — это результат статистической обработки большого массива данных, называемого обучающей выборкой. И вся её "интеллектуальность" на самом деле сводится к тому, чтобы при получении каких-то входных данных выплюнуть результат, который сохранился при обучении на тех конкретных данных.

Грубо, нейронке дали на вход тысячи разных фото с котиками, и сказали — это котик. Потом дали ещё столько же фоток собакенов — это собакен. В нейронах отпечатались числовые коэффициенты (веса) и можно теперь на вход подавать какую-то новую фотку и ожидать на выходе что-то вроде "это 34% котик и 18% собак". Я намеренно не буду углубляться в особенности алгоритмов и разные способы сделать их "умнее". Важен принцип: нейросети — это алгоритм для распознавания паттернов, образов. Там нет интеллектуальной деятельности от слова совсем.

Распознавать фоточки и текст, имитировать диалог, переводить, рисовать однотипные картинки по текстовому запросу, предлагать код в редакторе, чистить звук от шума, подсвечивать новобразования в снимках МРТ — да. Но думать — нет, сорри.

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

Как и у любого алгоритма, у нейросетей есть свои минусы и ограничения. Первое, что вытекает из определения — это обучающая выборка. Она должна быть очень большой, очень полной и очень достоверной. Если мы дали всего по 100 фоток котиков и собак, точность распознавания будет никакая. Если мы не додали фоток мышей, то грызуны будут распознаваться котопсами. Если мы взяли в качестве источника википедию, то итоговая нейронка будет с явно перекошенными политическими убеждениями.

Самое прикольное, что исправить "убеждения" нейронки очень сложно, т.к. она представляет собой не структурированную библиотеку с человеко-читабельными записями, а просто кучу цифр и какая там цифра за что отвечает — невозможно определить. Это приводит к смешным (и обидным) казусам, типа того как Google Photos распознавали негров как обезьян, и к вынужденному обкладыванию костылями поверх выданных результатов вроде исправления 6+пальцевых персонажей или ручной цензуры — про Путина не говорить, порнуху не рисовать. В общем, если в обучающую выборку когда-то попали кривые данные, то выковырять их оттуда никак не получится — проще обучить заново.

На этом страдания разработчиков не заканчиваются: выбор параметров и структуры нейросети — штука нетривиальная и делается методом проб и ошибок с подключением интуиции (т.к. у этой задачи нет правильного ответа). Сколько у нейронки входов/выходов, глубина и прочее — всё это определяется разработчиком и, соответственно, тоже может быть зафакаплено.

Нейросети очень долго и дорого обучать — требуется много процессорной мощи и электроэнергии. А ещё их очень сложно "дообучивать" в реальном времени на новых данных: новости должны просочиться в нейрончики, и как-то скорректировать веса связей, обученных ранее (см. выше про исправление убеждений).

В общем, конечным пользователям всегда стоит задаваться вопросами:
- На каких данных обучалась нейронка?
- Кто эти данные предоставил и можно ли ему доверять?
- Являются ли данные достоверными и актуальными?
- Как мы можем убедиться в том, что ничего левого в нейронку не попало (спойлер: никак)?

Текст получился большим, так что вопросы о том, заменит ли ИИ человека, почему нейросети внедряют во всё подряд, почему в это вливают огромные бабки, случится ли вот-вот качественный скачок, мы оставим до следующего раза.
👍3
P.S. кстати, теоретическая база ИИ была заложена еще в 60-х годах, однако тогда еще не было достаточных вычислительных мощностей, чтобы реализовать это на практике
Я там дропнул новый релиз моей утилитки для генерации красивых плашек для ГитХаба с вашей статистикой по языкам

https://github.com/DiPaolo/git-stats-plate-gen/releases/tag/v2.1.0

Пробуйте, отписывайте баги, пожелания, похвальбы

#git #news #release
👍3👎1🤔1
спешу поделиться с вами радостью!

в совсем недавно вышедший питон 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