Код на салфетке


Kanal geosi va tili: Rossiya, Ruscha


Канал для тех, кому интересно программирование на Python и не только.
Сайт: https://pressanybutton.ru/
Чат: https://t.me/+Li2vbxfWo0Q4ZDk6
Заметки автора: @writeanynotes
Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams

Bog‘liq kanallar  |  O‘xshash kanallar

Kanal geosi va tili
Rossiya, Ruscha
Statistika
Postlar filtri


Приветствую!

«Грязь» (2013)

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

Брюс — социопат, расист, наркоман и алкоголик, который при этом умудряется оставаться обаятельным в своей испорченности. По мере того как расследование движется вперёд, его психическое состояние ухудшается, а грань между реальностью и бредом стирается.

Фильм не пытается оправдать героя, а скорее показывает его как продукт системы, где выживает самый беспринципный. Подойдёт, если вам нравятся жёсткие character study с сильной актёрской игрой, чёрным юмором и ощущением, что ты смотришь в бездну, которая смотрит в тебя.

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


Знаете ли вы, что tar до сих пор пишет архивы под магнитную ленту?

На магнитной ленте между записями оставались промежутки, которые занимали место. Поэтому tar объединял блоки в крупные записи. След этого решения виден даже в пустом архиве:

import tarfile, os

with tarfile.open("empty.tar", "w") as tar:
pass

print(os.path.getsize("empty.tar")) # 10240
print(open("empty.tar", "rb").read() == b"\x00" * 10240) # True

В архиве нет ни одного файла, но на диске он занимает десять килобайт – все они заполнены нулями.

Эти размеры зашиты в стандартную библиотеку Питона константами:

print(tarfile.BLOCKSIZE) # 512
print(tarfile.RECORDSIZE) # 10240

BLOCKSIZE – это блок формата, минимальная единица, которой оперирует tar. RECORDSIZE – размер ленточной записи, в нее входит двадцать блоков. Число двадцать называется blocking factor, и в утилите командной строки оно меняется флагом -b.

Нули появляются и там, где данные есть:

with open("a.txt", "w") as f:
f.write("hi")

with tarfile.open("one.tar", "w") as tar:
tar.add("a.txt")

print(os.path.getsize("one.tar")) # 10240

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

Смысл этой механики описан в мануале GNU tar: записи на ленте разделялись промежутками, которые тратили место впустую, и чем крупнее запись, тем экономнее расходуется лента.

Двадцать блоков – это компромисс, выбранный под железо семидесятых.

Код на салфетке x Кусочки кода


Привет, друзья! 👋

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

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

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

⚙️ Среда, 23.09.2026 — Знаете ли вы, почему в Git у master никогда не было slave?

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


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

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

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

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

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

😼 @napkincode


Всем привет!

«Облачный атлас» (2012)

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

Одни и те же актёры играют разных героев в разных временных линиях, подчёркивая идею связи душ и повторяющихся паттернов в истории человечества. Фильм нелинейный: сцены постоянно переключаются между эпохами, и только к концу всё складывается в единую картину.

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

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


Знаете ли вы, почему в Git у master никогда не было slave?

Слово master по умолчанию кажется половиной от пары master/slave. Такую терминологию используют в системах репликации, где master означает ведущий узел, а slave – ведомый. Но история этого имени в Git совсем другая: master была обычным названием начальной ветки, и никакой парной сущности slave в Git не существовало.

У этого имени нет никаких особых свойств:

repo=$(mktemp -d)
git -C "$repo" init -q -b banana
git -C "$repo" symbolic-ref --short HEAD
# banana

cat "$repo/.git/HEAD"
# ref: refs/heads/banana

Ветка в Git – всего лишь ссылка на коммит. Начальную ветку можно назвать как угодно, хоть main, – файл HEAD будет указывать на соответствующую ссылку в refs/heads. Отдельного типа или роли master в модели данных у Гита нет.

Низкоуровневую основу Гита в 2005 году написал Линус Торвальдс и почти сразу Петр Баудиш, один из первых контрибьюторов в экосистему Git, создал поверх нее git-pasky – набор патчей и shell-скриптов, который превращал внутренние команды Git в привычную сегодня систему контроля версий с командами для коммитов, истории, слияний и работы с удаленными репозиториями.

Именно в git-pasky впервые появились знакомые нам имена master и origin. Добавляя поддержку веток, Баудиш сделал HEAD ссылкой на текущую ветку, а первую ветку назвал master. Следом он добавил команду git clone: исходный репозиторий получал имя origin, а локальная ветка master начинала его отслеживать.

Позже git-pasky переименовали в Cogito. Его код не влился обратно в Git, но больше года он служил основным интерфейсом для ранних пользователей и площадкой, на которой складывались привычные нам способы работы с Git. Вместе с ними закрепились и выбранные Баудишем имена.

Позже Баудиш объяснил, что имел в виду master-recording – термин, пришедший из звукозаписи – то есть оригинал, с которого делают копии. При этом он оговорился, что уже не помнит точную причину выбора и не исключает влияние BitKeeper – системы контроля версий, которую использовали для разработки ядра Linux до появления Git и в которой встречалась терминология master/slave. Торвальдс же влияние BitKeeper считал маловероятным – по его мнению источником могло быть выражение master repository из CVS.

Какой бы ни была исходная ассоциация, в самом Git master появилось как название первой ветки. Связанной с ней роли или ветки slave в Git никогда не существовало.

Код на салфетке x Кусочки кода


Привет, друзья! 👋

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

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

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

🐳 Среда, 16.09.2026 — И снова немного про DeepSeek — но на этот раз не мем, а плагин 😎

⚙️ Среда, 16.09.2026 — Знаете ли вы, что /bin и /usr/bin разделили, потому что у авторов Unix кончилось место на диске?

📓 Четверг, 17.09.2026 — #Почему_IT | Выпуск №9

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


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

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

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

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

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

😼 @napkincode


Всем доброго вечера пятницы!

«Игра на понижение» (2015)

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

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

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

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








DeepSeek упал. Держу в курсе.


Привет, друзья! 👋

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

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

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

⚙️ Среда, 09.09.2026 — Знаете ли вы, почему TCP не сохраняет границы сообщений?

📓 Пятница, 11.09.2026 — Привет! На связи Сергей, автор вторнично-средовой рубрики "Знаете ли вы..." / Кусочки кода.

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


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

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

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

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

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

😼 @napkincode




Приветствую!

«Переломный момент» (2015)

«Переломный момент» — британская документальная драма о споре вокруг серии видеоигр Grand Theft Auto. В центре истории — адвокат Джек Томпсон, который пытается доказать, что жестокие игры провоцируют насилие, и требует запретить их продажу.

Ему противостоит руководство Rockstar Games, во главе с Сэмом Хаузером, защищающее свободу творчества и право игроков самим выбирать развлечения. Спор выходит за пределы обычного суда и превращается в публичную войну о морали, ответственности разработчиков и влиянии игр на подростков.

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

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


Привет! На связи Сергей, автор вторнично-средовой рубрики "Знаете ли вы..." / Кусочки кода.

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

Это не уникальный случай сообщества "Салфетки" – а нормальное состояние индустрии в данный момент.

В то время как в "AI-пузыре" (информационном; не в том, который вот-вот лопнет) практики появляются и отмирают со скоростью инференса – индустрия, в общем, перемалывает данный тренд своими жерновами неспешно и, в отличие от громких высказываний известных голосов последних лет (вроде Альтмана или Цукерберга), разработчиков не то что не заменили нейронки – они все так же уверенно сидят в своих удобных креслах и только начинают с осторожностью, но уже внимательнее приглядываться к применению этой магической автоматики на регулярной основе.

Тем не менее, агентская разработка входит в корпоративную жизнь и уже никуда не денется. Даже если все, кто может, уйдут со всех рынков мира, а дата-центры Амазона сгинут в пламени судного дня – опенсорс-модели, уже слабо уступающие корпоративным, останутся и будут прекрасно работать на мак-мини, запитанном от ядерной батарейки, так что никто не помешает вам спокойно пилить свой SaaS (кроме собак-мутантов).

А пока этого не произошло – конкурентное преимущество будет у тех команд и компаний, которые быстрее и надежнее адаптируют свои пайплайны к светлому будущему и стандартизируют процессы постановки задач и работы с агентами для ускорения доставки. Я написал на Хабр большую статью с разбором самых обычных для этого дела практик – жду вас в комментариях тут и там!

https://habr.com/ru/articles/1081076/


Знаете ли вы, почему TCP не сохраняет границы сообщений?

Клиент отправляет hello и world двумя отдельными вызовами sendall(). На тестах кажется, что сервер сможет получить их двумя соответствующими вызовами recv(), но TCP такой связи не гарантирует. Он передает упорядоченный поток байтов, а каждый recv() возвращает доступную часть этого потока в пределах указанного размера.

import socket

server = socket.create_server(("127.0.0.1", 0))
client = socket.create_connection(server.getsockname())
connection, _ = server.accept()

client.sendall(b"hello")
client.sendall(b"world")
client.shutdown(socket.SHUT_WR)

data = b""
while chunk := connection.recv(1024):
data += chunk

print(data)
# b'helloworld'

Получатель видит десять байтов подряд. В потоке нет информации о том, были они отправлены как hello и world или разбиты между вызовами иначе. Кроме того, один большой send() может потребовать нескольких чтений, потому что recv(1024) возвращает максимум 1024 байта.

Границы добавляет протокол приложения. Например, перед сообщением можно передать его длину:

import socket
import struct

def receive_exactly(sock, size):
data = b""
while len(data) < size:
chunk = sock.recv(size - len(data))
if not chunk:
raise EOFError("connection closed")
data += chunk
return data

def receive_message(sock):
size = struct.unpack("!I", receive_exactly(sock, 4))[0]
return receive_exactly(sock, size)

server = socket.create_server(("127.0.0.1", 0))
client = socket.create_connection(server.getsockname())
connection, _ = server.accept()

for message in (b"hello", b"world"):
client.sendall(struct.pack("!I", len(message)) + message)

print(receive_message(connection))
print(receive_message(connection))
# b'hello'
# b'world'

Первые четыре байта задают длину следующего сообщения. receive_exactly() продолжает читать поток, пока не соберет нужное количество байтов, поэтому код работает при любом разбиении данных между вызовами recv().

TCP гарантирует порядок байтов, а границы сообщений определяет протокол приложения: длиной, разделителем или форматом с собственным фреймингом.

Код на салфетке x Кусочки кода


Привет, друзья! 👋

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

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

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

⚙️ Вторник, 01.09.2026 — Знаете ли вы, почему rm *.log не удалит все log-файлы?

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

📓 Воскресенье, 06.09.2026 — #Почему_IT | Выпуск №8


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

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

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

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

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

😼 @napkincode




Всем привет!

«Высотка» (2015)

«Высотка» — мрачная антиутопия о роскошном небоскрёбе, который выглядит как идеальный город будущего. Молодой доктор Роберт Лэнг переезжает на 25-й этаж и быстро замечает, что жители здания разделены не только этажами, но и социальным статусом.

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

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

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


Знаете ли вы, почему rm *.log не удалит все log-файлы?

Если в каталоге лежат app.log и .debug.log, логика команды rm *.log выглядит, на первый взгляд, очевидно: она должна удалить все файлы с таким суффиксом. Но на самом деле, скрытый файл останется на месте – rm получает уже раскрытый shell-список файлов, а не шаблон, и в этот список скрытые имена не попадают.

mkdir -p demo && cd demo
touch app.log .debug.log

printf "%s\n" *.log
# app.log

rm *.log
ls -a
# .
# ..
# .debug.log

Shell раскрывает *.log до запуска rm: смотрит в текущий каталог, выбирает имена, подходящие под шаблон, и подставляет их в команду. В примере под шаблон подходит app.log, поэтому запускается rm app.log. .debug.log начинается с точки, а такие имена попадают только в шаблоны, где точка написана явно.

Чтобы скрытый файл попал в glob, точку нужно написать явно:

touch app.log .debug.log

printf "%s\n" *.log .*.log
# app.log
# .debug.log

rm *.log .*.log
ls -a
# .
# ..

Но .* как универсальный паттерн для удаления лучше не использовать вслепую: он слишком широкий и цепляет не только нужные файлы. Для конкретной задачи безопаснее писать конкретный суффикс, например .*.log, или сначала посмотреть раскрытие через printf "%s\n" ....

Glob раскрывается до запуска команды. rm *.log удаляет только те пути, которые shell подставил вместо *.log. Скрытые имена начинаются с точки, поэтому для них точка должна быть в шаблоне явно.

Код на салфетке x Кусочки кода

20 ta oxirgi post ko‘rsatilgan.