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

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

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Знаете ли вы, что kill -9 не всегда убивает процесс?

Запускаем kill -9 <PID>, ждем что процесс будет убит – а он продолжает висеть в ps aux. Пробуем еще раз от рута, с разными сигналами – ничего не помогает. Проблема здесь в том, что процесс в статусе D (uninterruptible sleep) просто игнорирует все сигналы, включая SIGKILL. Это происходит потому что процесс находится в системном вызове ядра и ждет завершения I/O операции – пока ядро не закончит работу, процесс не может быть убит.

Представим себе такой неубиваемый процесс:

# Запустим что-то с подвисшим NFS
ls /mnt/broken_nfs &

# Посмотрим на статус процесса
ps aux | grep ls
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# user 1234 0.0 0.1 2345 678 ? D 10:30 0:00 ls /mnt/broken_nfs

# D в STAT означает тот самый uninterruptible sleep
# Попробуем его убить
kill -9 1234

# Но процесс все еще жив:
ps aux | grep 1234
# kill -9 не сработал


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

Но мы можем увидеть ВСЕ процессы в D-состоянии:

# Через ps aux
ps aux | awk '$8 ~ /D/ { print $0 }'

# Или через top/htop
top
# Прожимаем 'o' для фильтра, вводим: S=D
# Покажутся только D-процессы

# Смотрим stack trace процесса
cat /proc/1234/stack
# [<0>] wait_on_page_bit+0x123/0x456
# [<0>] read_pages+0x234/0x567
# [<0>] __do_page_cache_readahead+0x345/0x678
# Будет видно что процесс ждет чтения страницы


Stack trace показывает где именно процесс застрял в ядре. Обычно это функции работы с файловой системой, сетью или устройствами.

Процесс в D можно убить, но только через перезагрузку или починив то, что он ждет:

# Для NFS – размонтировать принудительно
umount -f /mnt/nfs
# Или ленивое размонтирование
umount -l /mnt/nfs


Процессы будут убиты, когда NFS отвалится; для сломанного диска – только перезагрузка.

Почему SIGKILL не сработает? Потому что сигналы обрабатываются только когда процесс возвращается в user space. D-процесс находится в kernel space системного вызова, а ядро не проверяет сигналы пока вызов не завершится. Но мы можем увидеть где процесс застрял:

cat /proc/1234/wchan
# wait_on_page_bit
# Процесс ждет страницу в памяти


Процессы в состоянии D (uninterruptible sleep) не реагируют на сигналы, включая SIGKILL. Они застревают в системных вызовах ядра, обычно при I/O операциях с зависшими устройствами (NFS, сломанный диск, RAID). Убить такой процесс можно только решив проблему ввода-вывода – размонтировав файловую систему, отключив устройство или через перезагрузку. Проверяйте статус процесса через ps – если в колонке STAT стоит значение D – значит kill -9 не поможет.

Код на салфетке x Кусочки кода
🔥11👍51
Всем доброго вечера пятницы!

«Искусство самообороны» (2019)

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

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

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

Приятного просмотра!
🔥3👍21
Всем привет!

Уже завтра в 13:00 МСК, мы встречаемся на практикуме по Python!

Что будем делать?
В прямом эфире, вместе со мной, вы:
👉 Напишете код Telegram-бота.
👉 Подключите к нему искусственный интеллект GigaChat.
👉 Задеплоите его, чтобы он работал.

И всё это — за одну встречу.
Даже если вы никогда раньше не программировали, у вас получится рабочий проект. Это лучший способ понять, подходит ли вам Python.

Как попасть?
Эфир закрытый. Чтобы получить доступ, нужна регистрация:
Зарегистрироваться

ВАЖНО: Подготовка к эфиру
Это не вебинар "послушать под чай", а практикум. Чтобы мы успели всё сделать, нужно подготовить рабочее окружение заранее.

Сразу после регистрации вы попадете в чат участников. Там в закрепе лежит инструкция. Пожалуйста, выполните её сегодня вечером, чтобы завтра в 13:00 мы сразу начали творить магию, а не устанавливать программы.

До встречи завтра в эфире! 🚀
🔥82❤‍🔥2👏21
Привет, друзья! 👋

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

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

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

🤖 Вторник, 03.02.2026 — Знаете ли вы, что kill -9 не всегда убивает процесс?

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

⚙️ Суббота, 07.02.2026 — Практикум по Python


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

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

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

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

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

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Всем привет!

В это воскресенье прошёл практикум по Разработке Telegram-бота с ИИ.

На практикуме было очень активно! Большинство зрителей повторяли вместе со мной. У кого-то были трудности, но мы их решали вместе. Также было море интересных (а порой и внезапных) вопросов!

Запись практикума доступна на YouTube: смотреть

Буду рад, если лайкнете видео и напишете комментарий как вам практикум. Жду ваши отзывы.

P.S. И подписывайтесь на наш канал, надо его оживлять и делать видео! https://www.youtube.com/@codeonanapkin

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4👏4🍾3❤‍🔥2
Знаете ли вы, что > затирает файл до выполнения команды?

Бывает, нужно изменить файл на месте, напишешь cat file.txt > file.txt – а файл пустой. Дело в том, что Shell открывает файл для записи и обрезает его в ноль до того, как запустится команда. К моменту когда cat пытается его прочитать, в файле уже ничего нет.

Посмотрим:

echo "Hello World" > test.txt
cat test.txt
# Hello World

cat test.txt > test.txt
cat test.txt
# (пусто - ничего не выводит, файл 0 байт)


Файл обнулился до того как cat успел его прочитать. То же самое с любой командой – grep pattern file.txt > file.txt или sort file.txt > file.txt дадут пустой файл:

1. Shell видит > file.txt и открывает файл для записи
2. Файл обрезается до 0 байт
3. Команда запускается и читает уже пустой файл

Правильно – сделать временный файл:

echo -e "3\n1\n2" > numbers.txt
sort numbers.txt > temp.txt && mv temp.txt numbers.txt
cat numbers.txt
# 1
# 2
# 3


Shell обрабатывает редиректы до запуска команды – файл обнуляется в момент открытия для записи, еще до выполнения. Для модификации на месте используйте временный файл или утилиты с флагом -i типа sed -i.

Код на салфетке x Кусочки кода
🔥8👍5👏1
Ну штош! Прошёл почти месяц и вот оно, свершилось!

Библиотеку добавили на страницу со сторонними решениями. И не только мою, по всей видимости, раньше тут было меньше.

https://yookassa.ru/developers/using-api/using-sdks#community
🔥14👍2
Привет, любители мрачной антиутопии!

«Бегущий человек» (1987)

«Бегущий человек» — бодрый антиутопический боевик с Арнольдом Шварценеггером, который до сих пор смотрится актуально. Действие перенесено в мрачное будущее, где военная диктатура держит страну под контролем с помощью жестокого телешоу: заключённых бросают в смертельную игру, а за ними охотятся яркие, карикатурные киллеры-звезды эфира.

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

Пафосные фразы, гротескные злодеи, критика ТВ и власти — тот редкий случай, когда под «олдскульным» экшеном скрывается довольно злая сатира.

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

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

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

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

🔄 Понедельник, 09.02.2026Дайджест, Telegram BOT API 9.4: цветные кнопки и премиум эмодзи

🤖 Вторник, 10.02.2026 — Практикум по Разработке Telegram-бота с ИИ, Знаете ли вы, что > затирает файл до выполнения команды?

⚙️ Среда, 11.02.2026 — Вышло обновление aiogram 3.25.0!

🎬 Пятница, 13.02.2026МСР: Трое в лодке, не считая контекста ч.2, Пятничный кинорелакс


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

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

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

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

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

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥311
Знаете ли вы, что time.sleep() в Python не гарантирует точную паузу?

Когда нужно приостановить выполнение скрипта на заданное количество времени, первое, что приходит на ум – это time.sleep(). Кажется, что time.sleep(5) всегда остановит выполнение ровно на 5 секунд. Но это не так – time.sleep(X) это скорее обещание операционной системы приостановить процесс как минимум на X секунд, не гарантия точной паузы.

Проверим на 1000 итераций:

import time

duration = 0.001 # 1 миллисекунда
diffs = []

for _ in range(1000):
start = time.monotonic()
time.sleep(duration)
actual = time.monotonic() - start
diffs.append(actual - duration)

print(f"Запрошенная пауза: {duration * 1000:.1f} мс")
print(f"Мин. отклонение: +{min(diffs) * 1000:.3f} мс")
print(f"Среднее отклонение: +{sum(diffs)/len(diffs) * 1000:.3f} мс")
print(f"Макс. отклонение: +{max(diffs) * 1000:.3f} мс")


При запуске будет видно, что все 1000 раз фактическая пауза больше запрошенной: sleep() гарантирует паузу не менее указанного времени, но не точно указанное время.

Почему так происходит?

1. Планировщик ОС – после сна процесс встает в очередь и ждет, пока ОС до него доберется.
2. Разрешение таймера – если гранулярность 10 мс, запрос на 1 мс все равно займет минимум 10, а sleep(0) – значит, отдать остаток кванта другим процессам.
3. Системная нагрузка – чем больше загружена система, тем больше задержка.

time.sleep() хорошо подходит, когда нужна приблизительная пауза или просто разгрузить процессор. Но если нужна высокая точность синхронизации, нужны более низкоуровневые механизмы, учитывающие особенности конкретной ОС.

Код на салфетке x Кусочки кода
🔥631
Kawai-Focus 2.3: логика приложения на TypeScript
Автор: Eugene Kaddo

Данная статья посвящена:
- Переписыванию логики приложения с JS на TS;
- Исправлению второй проблемы в Arch Linux с использованием issue.


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

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

#JS #Open_source #Наши_Open_Source_проекты #Rust #Kawai-Focus #Tauri #Ionic #Vuejs

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥53
Всем доброго вечера пятницы!

«Человек-бензопила: История Резе» (2025)

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

Она учит его простым вещам — читать, считать, плавать, отдыхать, наслаждаться мелочами. Между ними рождаются искренние чувства, но чем теплее становится их связь, тем яснее становится, что у Резе есть секреты и своё тёмное прошлое, которое не совместимо с тихим счастьем и свиданиями под дождём.

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

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

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

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

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

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

🤖 Вторник, 17.02.2026 — Знаете ли вы, что time.sleep() в Python не гарантирует точную паузу?

⚙️ Четверг, 19.02.2026 — Kawai-Focus 2.3: логика приложения на TypeScript

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


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

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

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

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

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

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥311
Знаете ли вы, что cd – это не программа?

cd и ls – обе короткие, используемые каждый день в терминале, команды. Но одна из них – программа, файл на диске, а другая – функция, встроенная прямо в shell.

type ls
# ls is /usr/bin/ls

type cd
# cd is a shell builtin


ls – обычная программа в /usr/bin/. А cd в файловой системе не существует, он живет внутри самого shell.

Зачем так сделано? Когда shell запускает любую программу, он создает для нее дочерний процесс. Дочерний процесс работает в своей копии окружения и не может передать изменения обратно родителю. Если бы cd был программой – он бы сменил директорию внутри дочернего процесса и тот бы завершился, а ваш shell остался бы где был.

Попробуем запустить cd как отдельный процесс, как если бы он был программой:

bash -c "cd /tmp && pwd"
# /tmp

pwd
# остался в той же директории


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

Кстати, export, source, exit – тоже встроенные по той же причине. Все они должны менять состояние текущего shell: переменные окружения, выполнение скриптов в текущем контексте, завершение сессии. Если вынести любую из них в отдельный процесс – она теряет смысл.

Код на салфетке x Кусочки кода
👍10🔥31👎1
ИИ бот-модератор 2 - Формирование структуры
Автор: Иван Ашихмин

Вторая часть серии «ИИ бот-модератор». Переходим от настройки инструментов к серьезной архитектуре. Разберем основы DDD, спроектируем слои приложения (Domain, Infra, Presentation) и настроим гибкую конфигурацию через Dynaconf. Строим надежный каркас, который позволит боту легко расти и не превратиться в хаос.


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

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

#Python #PostgreSQL #Гайды #aiogram #Telegram_бот #Dynaconf #uv #DDD #Domain_Driven_Design #Архитектура

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32
Чем отличается RAG по туториалу от реальной системы

Собрать RAG или агента по туториалу — легко. А довести до пользователя так, чтобы он не сломался — нет.

Но в реальной эксплуатации начинаются сюрпризы:
галлюцинации, нестабильное качество, высокий latency, неожиданные счета за API, агент зацикливается или принимает странные решения. Всё вроде работает — но бизнесу этим пользоваться нельзя.

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

Поэтому DL-инженеры из DeepSchool сделали курс «RAG и AI-агенты», программу про переход от прототипа к рабочим системам.

После обучения вы сможете:
• выбирать архитектуру под задачу, нагрузку, бюджет
• проектировать и собирать production-ready RAG и агентские системы с измеримыми метриками
• настраивать качество: query rewriting, reranking, гибридный поиск, tool-use, memory
• разбираться в системном дизайне и деплое
• чётко формулировать задачу, определять границы MVP и осознанно выбирать компромиссы в реализации

Программа для ML/DL-инженеров и backend-разработчиков, которые работали с LLM и хотят строить системы для реальных пользователей.

Для подписчиков моего канала до 6 марта действует скидка 25% 🔥

Изучайте подробности на сайте и оставляйте заявку!

Реклама. ИП Фатыхов Тимур Маратович, ИНН 540132430312, Erid 2VtzqwJny1e
🔥31
Привет, любители фантастики!

«Мистер Робот» (2025)

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

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

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

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

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21