Код на салфетке
2.37K subscribers
810 photos
21 videos
2 files
837 links
Канал для тех, кому интересно программирование на Python и не только.

Сайт: https://pressanybutton.ru/
Чат: https://t.me/+Li2vbxfWo0Q4ZDk6
Заметки автора: @writeanynotes

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Всем привет!

В этот четверг выступил спикером на Деловом марафоне от НИУ ВШЭ (Нижний Новгород). Мероприятие называлось довольно эпично — «Человек vs Машина: Как стать незаменимым в эпоху ИИ»

Мой доклад был посвящен максимально практичной теме: «ИИ как инструмент в руках разработчика».

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

О чем конкретно поговорили:
➡️ Проблемы ИИ и «Вайбкодинг»: почему писать код исключительно «на вайбе» с помощью промптов — это весело в пет-проектах, но часто приводит к архитектурным катастрофам в реальном проде.
➡️ Снижение рутины: как правильно делегировать ИИ скучные задачи и ускорять свою работу.
➡️ Безопасное применение: как использовать нейросети так, чтобы они приносили пользу разработчику, а не плодили технический долг и баги в проекте.

Было здорово пообщаться со студентами и посмотреть на то, как новое поколение специалистов воспринимает ИИ-инструменты. Спасибо организаторам за классный формат и приглашение!

Запись моего доклада уже доступна! Специально залил на разные площадки, выбирайте удобную:
🔴 YouTube: ссылка
🔵 VK Видео: ссылка
🟢 RuTube: ссылка

Кому интересно следить за подобными ивентами:
• Карьерный центр НИУ ВШЭ – НН: @hsecareernn
• Основной канал Вышки: @hse_nnov
• IT-академия Lad: @lad_it_academy

А как вы сейчас используете ИИ в своей работе? Пишете с ним код, отдаете рутину или пока не доверяете нейросетям ничего серьезного? Делитесь в комментариях! 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81👍1
Всем привет!

Я выпустил версию 2.4 Actions Telegram Notifier, которая добавляет поддержку Pull Request Review! Теперь вы будете получать еще более детальные уведомления о ходе работы над PR.

Изменения:
➡️ Добавлена поддержка события pull_request_review.
➡️ Уведомления теперь различаются в зависимости от статуса ревью: Approved (), Changes Requested () и Commented (💬).
➡️ Текст комментария (с ограничением по длине) теперь отображается прямо в уведомлении Telegram для быстрого понимания контекста.
➡️ Добавлена новая inline-кнопка "↗️ Link to Review", которая ведет прямо на конкретный комментарий или статус аппрува в PR.
➡️ Обновлены файлы README.md и README-RU.md с примерами использования нового триггера.

▶️ Ссылка на репозиторий проекта

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥3
Привет, друзья! 👋

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

📋 Новое на канале:

🔄 Понедельник, 23.03.2026Дайджест

🔧 Среда, 25.03.2026 — Знаете ли вы, что with в Python работает не только с файлами?

🤖 Четверг, 26.03.2026 — Agentic RAG Challenge. Я знаю что вы искали прошлым летом…

🎬 Пятница, 27.03.2026Пятничный кинорелакс

⚙️ Суббота, 28.03.2026 — Доклад "ИИ как инструмент в руках разработчика"

🤖 Воскресенье, 29.03.2026 — Обновление Actions Telegram Notifier

🔗 Будьте ближе к нам:

🌐 Читайте полные статьи на сайте

💬 Присоединитесь к обсуждению в чате

Мы в VK | Мы в MAX | Чат в MAX

Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе! 🚀

#дайджест #код #python #полезное #код_на_салфетке

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Знаете ли вы, что Python переиспользует маленькие числа?

Создаете два разных числа, сравниваете их через is, а Python говорит что это один и тот же объект – интерпретатор при старте заранее создает объекты для чисел от -5 до 256 и переиспользует их повсюду. Поэтому два разных присваивания a = 100 и b = 100 будут указывать на один и тот же объект в памяти.

a = 256
b = 256
print(a is b) # True – один и тот же объект
print(id(a), id(b)) # одинаковые id

a = 257
b = 257
print(a is b) # False – два разных объекта
print(id(a), id(b)) # разные id


Верхняя граница – 256. До нее Python отдает готовый объект из внутреннего кеша, после – создает новый каждый раз. Со строками похожая история – короткие строки, похожие на идентификаторы, тоже переиспользуются:

a = "hello"
b = "hello"
print(a is b) # True – Python закешировал строку

a = "hello world!"
b = "hello world!"
print(a is b) # False – строка с пробелом и спецсимволами не кешируется


Поэтому is не стоит использовать для сравнения значений – он сравнивает не значения, а адреса объектов в памяти. Для сравнения значений используйте ==.

Код на салфетке x Кусочки кода
🔥8👍31
Внутренний спор: как должны выглядеть подписи к полям ввода (лейблы).

На картинках выше — два варианта.

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

Как вам удобнее заполнять формы?

Выбор напрямую влияет на макеты — то, что победит, уйдёт в работу.

@smetapp

Мы в MAX
🔥21
Kawai-Focus 2.5: сборка и упаковка Tauri-приложения (Windows + Arch Linux, AUR)
Автор: Eugene Kaddo

Эта статья посвящена сборке приложения под Windows глазами человека, который делает это впервые и учится в процессе. Также я добавлю рецепт PKGBUILD для AUR под Arch Linux.


Читать статью на сайте
Читать статью на Хабр

Поддержать проект через YooMoney
Поддержать проект через Tribute в Telegram
Поддержать проект через наш Telegram-бот

#Arch #Kawai_Focus #Linux #Open_source #Tauri #Windows #Наши_Open_Source_проекты
🔥31
Всем доброго вечера пятницы!

«Казнить нельзя помиловать» (2026)

«Казнить нельзя помиловать» — научно‑фантастический триллер о недалёком будущем, где приговор выносит не человек, а ИИ‑судья по имени «Милосердие». Опытный детектив Крис Рэйвен приходит в себя прикованным к креслу в зале виртуального суда и узнаёт, что его обвиняют в серии терактов и у него всего несколько часов, чтобы доказать невиновность.

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

Приятного просмотра!
🔥51
Привет, друзья! 👋

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

📋 Новое на канале:

🔄 Понедельник, 30.03.2026Дайджест

🔧 Среда, 01.04.2026 — Знаете ли вы, что Python переиспользует маленькие числа?

🤖 Четверг, 02.04.2026 — Внутренний спор: как должны выглядеть подписи к полям ввода (лейблы), Kawai-Focus 2.5: сборка и упаковка Tauri-приложения (Windows + Arch Linux, AUR)

🎬 Пятница, 03.04.2026Пятничный кинорелакс


🔗 Будьте ближе к нам:

🌐 Читайте полные статьи на сайте

💬 Присоединитесь к обсуждению в чате

Мы в VK | Мы в MAX | Чат в MAX

Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе! 🚀

#дайджест #код #python #полезное #код_на_салфетке

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
Знаете ли вы, что zip() обрезает данные?

zip() всегда обрезает итоговый результат по длине самого короткого итерируемого объекта: все, что длиннее, просто игнорируется.

Это удобно, когда можно терять лишние данные, но может подставить, если нужна полная склейка:

names = ["Alice", "Bob", "Charlie"]
scores = [100, 85]

list(zip(names, scores))
# [('Alice', 100), ('Bob', 85)] – Charlie больше нет

zip() останавливается, как только заканчивается самый короткий аргумент. scores короче, поэтому Charlie не попал в итоговый список.

Если важно сохранить все данные и заполнить пустоты, лучше использовать zip_longest из модуля itertools:

from itertools import zip_longest
names = ["Alice", "Bob", "Charlie"]
scores = [100, 85]

list(zip_longest(names, scores, fillvalue=0))

# [('Alice', 100), ('Bob', 85), ('Charlie', 0)]

zip_longest не обрезает данные – он дотягивает короткие последовательности до самой длинной, заполняя пропуски fillvalue (по умолчанию None).

С Python 3.10+ у zip() появился строгий режим – strict=True. Если длины не совпадают, он сразу бросает ValueError:

list(zip(names, scores, strict=True))

# ValueError: zip() argument 2 is shorter than argument 1

strict=True гарантирует, что данные не потеряются случайно из-за разницы в длине итерируемых объектов.

Стандартный zip() обрезает хвосты – для сохранения данных целиком лучше выбирать zip_longest, а для контроля целостности делать проверку через strict.

Код на салфетке x Кусочки кода
🔥3👍211
Всем привет!

«Примат» (2026)

«Примат» — жёсткий хоррор про отпуск, который превращается в бой за выживание. Студентка Люси приезжает в уединённый дом на Гавайях к семье и их ручному шимпанзе Бену, а вместе с собой привозит компанию друзей для весёлой вечеринки у бассейна.

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

Фильм не стесняется жестокости и при этом поднимает тему хрупкости «домашней» безопасности и того, как быстро природа ставит людей на место

Приятного просмотра!
🔥3🗿2👎1
Привет, друзья! 👋

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

📋 Новое на канале:

🔄 Понедельник, 06.04.2026Дайджест

🔧 Среда, 08.04.2026 — Знаете ли вы, что zip() обрезает данные?

🎬 Пятница, 10.04.2026Пятничный кинорелакс


🔗 Будьте ближе к нам:

🌐 Читайте полные статьи на сайте

💬 Присоединитесь к обсуждению в чате

Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе! 🚀

#дайджест #код #python #полезное #код_на_салфетке

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
4 недели разработки. Первая контрольная точка.

Вчера прошло закрытое промежуточное демо проектов в IT-академии Lad. Наш ПМ Игорь показывал, что команда из 13 человек успела за месяц, и главное — куда мы идём.

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

Короткая выжимка (слайды с питча — на картинках выше):
Концепция. Мы не делаем очередной блокнот для расходов или перегруженную CRM. SmetApp — это конструктор. Есть лёгкое базовое ядро, на которое ты сам навешиваешь нужные модули (счета, операции, бюджет, аналитика). Ничего лишнего в интерфейсе не будет.
Под капотом. Бэкенд на Python + FastAPI (PostgreSQL, Redis, строим модульный монолит). Фронт на Nuxt 4 (Vue 3). Заложили управление фича-флагами на лету.
Прогресс. Авторизация и регистрация на бэке готовы. Фронт сейчас перекладывает макеты в код (веб + мобилка, с обработкой всех негативных сценариев). Дизайн первого экрана после входа уже отрисован (покажем попозже😉).
Дедлайн. Публичное демо MVP — в июле. До этого времени идём по жёсткому роадмапу (Апрель — авторизация, Май — структура, Июнь — ядро).

Движемся дальше. Спасибо команде, что тянет этот темп.

@smetapp
🔥121
Знаете ли вы, что defaultdict создает записи при чтении?

Удобно использовать defaultdict чтобы не проверять наличие ключей. Но с ним есть подвох: обращение к несуществующему ключу через d[key] не просто вернет значение по умолчанию, а создаст запись в словаре.

Словарь растет просто от того, что его читают:

from collections import defaultdict

d = defaultdict(list)
print(len(d)) # 0

# Читаем несуществующий ключ
result = d["users"]

print(len(d)) # 1
print(d) # defaultdict(<class 'list'>, {'users': []})
# Ключ 'users' теперь существует в словаре


Обращение через d["users"] вызвало factory-функцию (list), создало пустой список и записало его в словарь. Это не баг – так работает __missing__, который defaultdict переопределяет.

Проблема становится особенно заметной в циклах:

from collections import defaultdict

config = defaultdict(str)
config["host"] = "localhost"
config["port"] = "5432"

# Проверяем наличие опциональных ключей
optional_keys = ["timeout", "ssl", "pool_size"]
for key in optional_keys:
value = config[key] # Вместо проверки – создаются записи

print(dict(config))
# {'host': 'localhost', 'port': '5432', 'timeout': '', 'ssl': '', 'pool_size': ''}
# Три мусорных ключа из ниоткуда


Каждый config[key] для несуществующего ключа создал пустую строку и сохранил ее. Если потом итерироваться по config или сериализовать его – в данных будет мусор.

Безопасная альтернатива – .get(), который не трогает словарь:

from collections import defaultdict

d = defaultdict(list)

# .get() не вызывает __missing__
result = d.get("users")
print(result) # None
print(len(d)) # 0

# Проверка через in тоже безопасна
print("users" in d) # False
print(len(d)) # 0


.get() возвращает None (или указанный default), но не создает запись. Оператор in тоже не вызывает __missing__.

defaultdict вызывает factory-функцию и создает запись при любом обращении через d[key] к несуществующему ключу. Для безопасного чтения без побочных эффектов лучше использовать .get() или проверку через in.

Код на салфетке x Кусочки кода
🔥10🤯2
Вместо 8 разных VPS: как я организовал практику студентам на одном сервере
Автор: Иван Ашихмин

Выдать студентам по серверу, не плодя виртуалки и не покупая VPS? Легко! Я разделил один сервер на изолированные среды с помощью Incus. Внутри — пошаговый гайд и разбор полетов: починка сети на IPv6, конфликт Docker с ZFS и проброс портов. Делюсь реальным опытом и шишками!


Читать статью на сайте
Читать статью на Хабр

Поддержать проект через YooMoney
Поддержать проект через Tribute в Telegram
Поддержать проект через наш Telegram-бот

#Debian #DevOps #Incus #LXC #LXD #Ubuntu #VPS #Гайд #Контейнеризация
🔥6
Всем доброго вечера пятницы!

«Остров проклятых» (2009)

«Остров проклятых» — плотный психологический триллер Мартина Скорсезе с ДиКаприо, который начинаетcя как детектив, а заканчивается ударом по психике. В 1954 году маршал США Тедди Дэниэлс отправляется на остров Шаттер расследовать исчезновение пациентки психбольницы для особо опасных преступников.

Чем глубже он копает, тем более странными кажутся и врачи, и пациенты, и сам остров: заговоры, эксперименты на людях, намёки на промывку мозгов. Вопрос «кто тут сумасшедший?» постепенно меняется на «а можно ли доверять самому себе».

Это фильм, который держит атмосферой, тревогой и финалом, после которого хочется пересмотреть всё заново, уже зная правду.

Приятного просмотра!
🔥9