Кисель в АйТи | AI и технологии
الذهاب إلى القناة على Telegram
Я – Александр, и это мой авторский канал, где я пишу про разработку, AI и работу в айти. Купить рекламу: https://telega.in/c/kisel_it
إظهار المزيد4 295
المشتركون
-424 ساعات
-147 أيام
-3530 أيام
أرشيف المشاركات
Кажется, что реально у всех компаний нейро-шиза. У Logitech в приложении для настройки мышки есть AI Prompt Builder для вызова окошка с ChatGPT... Кому? Зачем? А я еще на Еду AI в Яндекс.Еде жаловался 😂
Ждём AI ассистент в калькуляторе, календаре и, самое главное - в приложении с будильником. Всем ведь там очень сильно не хватает AI фичей, правда?
🔛 @kisel_it
#ai
Мышь? Нет, лучше трекбол.
Взял тут себе Logitech MX Ergo S на замену старенькому трекболу с Али. До этого пользовался Zelotes F-33 — дешёвый вариант «на попробовать». Тогда я вообще не понимал, что это за штука такая — трекбол, и можно ли с ним полноценно полноценно работать или это только для дизайнеров и графики. Неожиданно он стал моей основной мышью больше чем на год. И за это время стало понятно: да, это удобно. Даже с простеньким сенсором и сборкой.
Вообще эта эпопея с разными мышками однажды началась из-за боли в кисти. С того времени прошел через 3 вертикальных мышки, но идеальную так и не нашел. Они более "специфичны", не все хорошо лежат в руке. Да и не сильно снимают нагрузку, просто меняют положение руки.
Так что не бойтесь пробовать. Конечно какое-то время нужно привыкнуть, но игра стоит свеч.
Причуды SQLite. Совсем недавно на оф. сайте SQLite набрёл на раздел "quirks", который рассказывает про "приколы" этой БД. Это просто баги и костыли к которым все привыкли. Многие даже не знают, что есть какие-то особенности вообще. Так что хочу с вами поделиться:
1. Типы данных не накладывают ограничений на типы данных в столбце. Это больше рекомендация, а не правило: Столбец с типом INTEGER может хранить текстовую строку. SQLite конечно попытается преобразовать строку в число, но если это не удастся, просто продолжит работать как ни в чем не бывало.
2. Отсутствие отдельных типов для BOOLEAN и DATETIME: В SQLite нет специальных типов для булевых значений или дат и времени. Вместо этого для BOOLEAN обычно используются целые числа 0 и 1, а для DATETIME — TEXT, REAL или INTEGER.
3. Столбцы могут вообще не иметь типа. Вы можете создавать таблицы, в которых у столбцов не указан тип данных.
Да, там появились STRICT-таблицы, но кто их использует?
4. NULL в PRIMARY KEY. Из-за старой ошибки, в SQLite столбец, являющийся PRIMARY KEY, может содержать значения NULL. Хотели пофиксить, но на эту "фичу" очень многие пользователи завязали логику работы своих приложений. Пришлось оставить во благо обратной совместимости.
5. Ключевые слова в качестве идентификаторов. SQLite позволяет использовать многие ключевые слова SQL в качестве имён для таблиц или столбцов без необходимости их экранирования.
6. Проверка внешних ключей (Foreign Keys) отключена по умолчанию. Хотя SQLite поддерживает внешние ключи, их проверка по умолчанию выключена. Чтобы её активировать, необходимо выполнить команду PRAGMA foreign_keys = ON; для каждого соединения с базой данных. Естественно этим тоже никто не пользуется и даже не подозревает в отсутствии проверки.
P.S Это между прочим самая популярная БД в мире, вне конкуренции. При этом её поддерживают всего 3 человека 😘
🔛 @kisel_it
#programming #sqlite
Чего только HR'ы из Яндекса не придумают. Нигде от них не спасёшься 🤣
Если вдруг пропустили - вышел Cursor 2.0. Всё труднее назвать его "очередным форком VS Code", прогресс впечатляет.
Самые важные изменения на мой взгляд:
Новый режим Multi-Agent. Это самое главное. Есть возможность выбрать между двумя совершенно разными подходами к разработке. Первый вариант в вкладке Agents и второй вариант в вкладке Editor. В Agents всё похоже на классический "чат", только внутри IDE. В Editor - привычный нам интерфейс редактора. Теперь можно запускать до 8 агентов параллельно, под капотом они используют git worktrees чтобы не конфликтовать.
Новая модель Composer. Говорят, что в скорости она аж х4 быстрее аналогов. Насколько умнее - не говорят. Если всё правда. то это реально круто. Для мелких правок скорость - самый важный фактор.
Переработали Code Review. Должно стать удобнее. Одно окошко, без переключения между файлами. Давно пора, в текущем виде это прям плохо.
Песочница. На маках по умолчанию появился "терминал-песочница" для команд с доступом к контексту проекта. Ох как хотелось бы увидеть такое на Linux, а то разных страшных историй уже целый вагон.
Управление голосом. В чат теперь можно наговорить всякого и посмотреть, что получится. Не представляю, как это использовать, хотя может кому-то и понравится.
В остальном - поработали над производительностью, улучшили качество сбора контекста, всякие разные ui-правки, фичи для командной работы.
P.S Ну, кто уже пробовал? Поделитесь впечатлениями
🔛 @kisel_it
#python #programming
Каким бы не был классным Pydantic, он принёс в Python и кое-что плохое - страх использовать словари. Да, тот самый обычный
dict. Ходит слух, что нужно обмазывать весь код моделями со всех сторон (важно ничего не пропустить), чтобы было лучше. Понятнее. Надежнее. Мммм, вкусно.
Зачем нам словарь вообще словари? DEPRECATED! Ни типизации, ни валидации. Никакого контроля! Еще и в отдельный файл не вынести... А если там целых ПЯТЬ ключей, о таком лучше не думать. А вдруг опечатка в названии ключа? А вдруг передадут не тот тип данных? А как мы узнаем какие типы данных нужно передать?
Точно ли это нужно всегда и везде? Сомневаюсь. Когда Я передаю данные СЕБЕ - мне не нужно ничего валидировать. Если я ошибусь - значит я ошибся. Пойду и исправлю. Если без типизации всё непонятно - поверь, главная проблема не в отсутствии моделей.
P.S Совет с пикчи влияет на качество кода даже сильнее, чем Pydantic-модели. Проверено! 😂
🔛 @kisel_it
#python #programmingПользователь: исправь ошибку, тесты падают.
Cursor: ни слова больше, всё сделаю!
Было бы смешно, если бы не было так грустно. Я сталкивался с таким поведением дважды 😂
В какой то момент Курсор ловит падающий assert в тестах в try/except (на самом деле ошибку нужно было ловить в коде проекта), потом запускает тесты. В результатах тестов видит, что всё прошло успешно и с чувством выполненного долга рапортует о том, что тесты исправлены и ошибки больше нет.
Ошибки и правда больше нет, но...
Ура! Наконец-то дописал статью про войну FastAPI и Django.
Всегда был уверен в том, что вокруг Django слишком много неоправданного негатива.
Многие вещи этот фреймворк умеет делать так хорошо, как "фастаперам" и не снилось. Но кто будет себя утруждать тем, чтобы детально разобраться перед тем как критиковать?)
Приятного прочтения 😺
У кого-то понедельник не удался. Docker registry и много других сервисов упали. Полностью. И уже много часов не могут ожить 🤔
Интересно, что же у них случилось?
Накину вам очередной use-case для Cursor.
Он очень хорошо ищет баги в коде. Причем баги обычно прячутся в взаимодействии между несколькими функциями/классами/модулями и накинуть такой контекст в тот же ChatGPT это просто мучение. А в случае с Cursor из коробки появляется простой инструмент, который в один промпт сделает именно то, что нам требуется.
Часто бывает, что просто глаз замылился и уже в упор что-то не видишь. Ну или просто не учёл, что какое-то из изменений выстрелит в другой части проекта.
Причем полезны даже ложные срабатывания. Они обычно подсвечивают очень "неочевидные" места, где не помешало бы накинуть комментарий.
На мой взгляд достаточно простого промпта в ask моде по типу "Найди все потенциальные проблемы, ошибки и нарушение бизнес-логики в новом коде/в фиче N/в модуле M".
В любом случае нужно код-ревью. И тестировщики. И хорошее покрытие кода тестами. Cursor ни один из этих этапов не исключает. Просто помогает поднять качество кода минимальным количеством усилий.
🔛 @kisel_it
#cursor #vibecoding #programming
+2
Вашему вниманию лучшие фоны для пятничных созвонов 🍷
🔛 @kisel_it
#memes
Просто тащусь с того, как Cursor считывает паттерн ручных действий и предлагает через Tab перейти к следующему месту и повторить.
К примеру - подчищаем старые комментарии, ненужные переменные, меняем нейминг и т.д. Понимает суть на лету и всё превращается в Tab-Tab-Tab 💪
P.S Tab-разработчики на месте? 😂
https://fi-le.net/pypi/ смотрите что нашел. Визуализация Python-пакетов из PyPI на основе зависимостей. Получаются некие "кластеры", где можно найти наборы пакетов из каждого направления разработки. К примеру: pytest, pytest x-dist, pytest-cov.
Либо openai, tiktoken, langchain.
Уверен, что каждый увидит для себя что-то новое 👍
Вышла первая бета Django 5.2. Релиз ждём в апреле.
Из интересного:
- Научили shell импортировать модели автоматически. Но кажется уже все привыкли к shell_plus.
- Доехала поддержка композитных первичных ключей (pk из нескольких полей).
- Теперь у base.html есть блок extrabody для добавления своего кода перед закрытием </body>, может быть удобно для кастомизации.
- Еще больше методов получили асинхронную версию.
UserManager.acreate_user(), User.ahas_perm() и т.д
- method_decorator() научился оборачивать асинхронные методы.
- Добавили предупреждение при запуске через runserver о том, что его нельзя использовать в проде. Кажется не поможет...
- В миграции завезли AlterConstraint, чтобы каждый раз не пересоздавать и не удалять констрейнты.
- Порядок полей в .values() и .values_list() теперь точно соответствует переданному. Соответственно .union() в таком случае гарантировано даст ожидаемый результат.
- Появились классы Deserializer для гибкого управления десериализацией. Никогда не было необходимости в этом, но выглядит хорошо.
-reverse() теперь принимает query и fragment keywords. Думаю стоит попробовать.
- 5.2 поддерживает Postgres от 14 версии и выше.
Подробности тут: https://docs.djangoproject.com/en/dev/releases/5.2/Будьте осторожны со своими желаниями. Нейросеть может их не понять 😂
Всех с пятницей!)
Вопрос: Как работает Garbage Collector в Python?
Это прям классика, встречается почти каждый раз. Если перечислите три основных механизма - уже будет достаточно :)
Ответ:
Здесь стоит выделить три ключевых механизма:
1. Подсчёт ссылок. Когда счётчик ссылок на объект падает до нуля, он удаляется.
2. Разрешение циклических ссылок. Если два объекта ссылаются друг на друга, их счётчик не упадёт до 0. Здесь нам понадобится альтернативный способ. Для разрыва циклов осуществляется обход всех объектов от "корня". Все объекты, которые не были найдены при таком обходе считаются "недостижимыми". Это и есть наши циклы и GC их удаляет.
3. Деление объектов на поколения.
Для оптимизации работы GC существует механизм "поколений". Новые объекты стартуют с generation 0. А после нескольких сборок мусора перемещаются в следующее поколение. Более старшие поколения проверяются реже, что экономит ресурсы.
#собесы
Оказывается существует модуль для обнаружения кодировки текста. Называется
chardet. Под капотом оно анализирует частотность символов и структуру, находя закономерности, которые есть у разных кодировок.
Использовать максимально просто:
import chardet
# Пример текста в неизвестной кодировке
text_bytes = "Привет, мир!".encode("windows-1251")
# Определение кодировки
result = chardet.detect(text_bytes)
print(result)
Вывод следующий:
{'encoding': 'windows-1251', 'confidence': 0.99, 'language': 'Russian'}
#pythonНа днях обратил внимание на то, что ruff подчищает многие импорты из typing. Это оказалось правило UP035, которое заменяет устаревшие импорты на актуальные.
Пошел искать, когда typing успел стать устаревшим. Дело оказалось в PEP 585 (https://peps.python.org/pep-0585/) начиная с Python 3.9. Вот это да!) Там прямым текстом написано "Importing those from typing is deprecated."
По ссылочке можно найти полный список того, что теперь нужно импортировать исключительно из collections.abc.
Pycharm кстати не в курсе и в первую очередь предлагает подтянуть всё из typing, а не collections. Может скажем им?)
