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

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

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
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🔥311
Всем привет!

«Примат» (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 #Гайд #Контейнеризация
🔥7
Всем доброго вечера пятницы!

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

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

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

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

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

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

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

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

⚙️ Вторник, 14.04.2026 — 4 недели разработки. Первая контрольная точка.

🔧 Среда, 15.04.2026 — Знаете ли вы, что defaultdict создает записи при чтении?

⚙️ Четверг, 16.04.2026 — Вместо 8 разных VPS: как я организовал практику студентам на одном сервере

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


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

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

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

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

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

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
Наш лендинг висел в сети с самого старта разработки. Просто как заглушка, чтобы поисковики начали его индексировать.

Теперь мы прикрутили туда раздел «Новости». Это полное зеркало нашего дневника разработки из Telegram.

Зачем? Не все сидят в Telegram. Мы хотим, чтобы любой человек из поиска мог зайти и увидеть: здесь реальные люди делают реальный продукт. С багами, спорами об архитектуре и честными отчётами.

Если вы читаете это на сайте (случайно зашли по ссылке) — добро пожаловать за кулисы. И запрыгивайте к нам в Telegram, чтобы голосовать за фичи вместе с командой.

Если вы читаете это в Telegram — сходите посмотреть, как интерфейс наших новостей выглядит в вебе.

→ Дневник в вебе: smetapp.ru/news
→ Главная: smetapp.ru
@smetapp
🔥4
Знаете ли вы, что += в Python это не просто сокращение x = x + y?

Выглядит как короткая запись – но под капотом это два разных оператора. x = x + y всегда создает новый объект и присваивает его переменной слева. += сначала пытается изменить сам существующий объект, не создавая новый – через метод __iadd__. И только если у типа такого метода нет – работает как обычный +: создает новый объект. Для изменяемых типов (list, bytearray) разница принципиальна.

Если на один список смотрят две переменные, две внешне одинаковые операции дают разный результат:

a = [1, 2, 3]
b = a
a += [4]
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4] – b изменился, теперь это тот же список

a = [1, 2, 3]
b = a
a = a + [4]
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3] – новый объект, b нетронут


Для списка += вызывает метод list.__iadd__ – он дописывает элементы в существующий объект и возвращает тот же самый объект. + всегда создает новый список. Поэтому когда на один список уже есть другая ссылка, результаты двух операций расходятся.

Еще одна ситуация – кортеж, внутри которого лежит изменяемый объект:

t = ([1, 2, 3],)
try:
t[0] += [4]
except TypeError as e:
print(e) # 'tuple' object does not support item assignment

print(t) # ([1, 2, 3, 4],) – список ВНУТРИ обновился


Python выполняет t[0] += [4] в два шага: сначала вызывает list.__iadd__ на внутреннем списке – список меняется и становится [1, 2, 3, 4]. Потом Python пытается записать результат обратно через t[0] = ... – и падает, потому что кортеж неизменяем. Операция и упала с ошибкой, и сработала одновременно.

Понять, создает ли += новый объект или меняет старый – можно через id():

x = 10
print(id(x))
x += 1
print(id(x)) # другой id – int неизменяем, += создал новый объект

lst = [1, 2]
print(id(lst))
lst += [3]
print(id(lst)) # тот же id – сам список поменялся, новый объект не создавался


Для неизменяемых типов (int, str, tuple, frozenset) += действительно эквивалентен x = x + y – создается новый объект и присваивается переменной. Для изменяемых – меняется тот же объект, к которому уже были привязаны и другие переменные. Отсюда и расхождение ссылок, и парадокс с кортежем.

+= это не синтаксический сахар, а отдельный оператор со своим dunder-методом __iadd__. Для изменяемых типов он меняет сам существующий объект, не создавая новый – из-за этого ломаются разделяемые ссылки и появляется парадокс с кортежем, в котором операция падает и срабатывает одновременно. То же самое относится к -=, *=, /= и остальным – у каждого свой __isub__, __imul__, __itruediv__.

В следующий вторник – * на списке: почему [[]] * 3 это не три копии, а три ссылки на один объект.

Код на салфетке x Кусочки кода
🔥71
Kawai-Focus 2.6: путь к MVP1 — создание экрана Таймер
Автор: Eugene Kaddo

Эта статья посвящена продолжению работы над MVP1. Сегодня я начну работу над как экраном «Таймер», который сможет воспроизводить демонстрационные таймеры, а в будущем — и пользовательские.


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

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

#Ionic #Kawai_Focus #Open_source #Tauri #Vue #Наши_Open_Source_проекты
1👍1🔥1😱1
Всем привет!

«Зелёная книга» (2018)

«Зелёная книга» — тёплая дорожная драма по реальной истории дружбы, которая не должна была случиться. В 60‑е годы грубоватый вышибала Тони Валлелонга становится водителем и охранником утончённого чернокожего пианиста Дона Ширли в туре по расистскому югу США.

Они ездят по городам, ориентируясь на «Зелёную книгу» — справочник мест, где чернокожих вообще готовы обслуживать. На фоне унижений, конфликтов и культурной пропасти между ними постепенно возникает уважение, а потом и настоящая дружба.

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

Приятного просмотра!
🔥5🤬2