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

channel icon
Канал для тех, кому интересно программирование на Python и не только.

Чат канала: @pressanybutton_chat
Заметки автора: https://t.me/writeanynotes
Буст канала: https://t.me/boost/press_any_button

Условия размещения

Цена за 24 часа в ленте 600,00
Цена за 1 час закрепления 100,00
Взаимопиар ≥ 600 подписчиков

Казино, мошенничества, пирамиды, ставки и всё в этом духе.

+1
832
подписчиков
-1
239
охват 1 публикации
0
~1
постов / день
-0,2%
28,8%
ERR % ?

Статистика

Последние публикации

Код на салфетке
21 декабря 2024 г. 13:53
Что выведет код с изображения? №48
Опрос
  • 9 [36, 81]
  • 9 [36, 81, 144]
  • 9 [36, 81, 144, 9]
  • 9 StopIterationError
Код на салфетке
21 декабря 2024 г. 13:53
Что выведет этот код? №48

Задача:
Вам нужно написать функцию, которая принимает список чисел и возвращает список их квадратов, но только тех, которые делятся на 3. Для оптимизации вы решили использовать генератор.

Перед вами уже готовый код. Что выведет этот код?
Код на салфетке
20 декабря 2024 г. 18:02
Приветствую всех, дорогие друзья!

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

Фильм: Грань будущего

Год: 2014

В недалёком будущем раса инопланетян вторгается на Землю. Никакая армия в мире не может противостоять им. Майор Уильям Кейдж умирает в бою, но случается невозможное – он оказывается во временной петле. Раз за разом он попадает в один и тот же бой, сражается и умирает… снова и снова. И каждое повторяющееся сражение приближает его к разгадке того, как победить врага.

Устраивайтесь поудобнее и готовьтесь к увлекательному просмотру.
Код на салфетке
19 декабря 2024 г. 10:06
FastAPI 5. Приложение аутентификации и Pydantic схемы
Автор: Иван Ашихмин

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


Читать постЧитать пост

Поддержать проект на Boosty
Поддержать проект в Telegram

#Python #IDE #Django #PyCharm #Гайды #FastAPI #Сервис_на_FastAPI #Бэкэнд #Poetry #Документация #SQLAlchemy #passlib #Шифрование_пароля
Код на салфетке
17 декабря 2024 г. 17:01
Знаете ли вы о возможностях multistage build в Docker для снижения размера образов?

Многошаговая сборка (multistage build) в Docker позволяет использовать разные образы для промежуточной сборки и финального приложения, чтобы значительно снизить итоговый размер образа.

# Стадия сборки
FROM golang:1.20-alpine AS builder
WORKDIR /app

# Копируем только нужные файлы
COPY go.mod go.sum ./
RUN go mod download

# Копируем source и build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp -ldflags="-w -s"

# Финальная версия
FROM alpine:3.18
RUN apk --no-cache add ca-certificates

WORKDIR /root/
# Копируем только скомпилированный бинарник
COPY --from=builder /app/myapp .

# Ставим non-root пользователя
USER nobody

CMD ["./myapp"]


– В первом этапе мы используем полноценный образ для сборки.
– Во втором этапе берем только скомпилированный бинарник.
Таким образом, финальный образ занимает гораздо меньше места, чем образ с полностью установленными инструментами разработки.
Код на салфетке
16 декабря 2024 г. 17:04
Привет, друзья!

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

Понедельник (09.12.2024) Дайджест за предыдущую неделю

Вторник (10.12.2024) Хотите узнать, как сочетать asyncio и aiohttp для асинхронного веб-скрапинга?

Пятница (13.12.2024) Пятничный кинорелакс

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

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
Код на салфетке
15 декабря 2024 г. 20:29
Репост:
Всем привет!

Помимо программирования, я активно изучаю и DevOps направление: Администрирование серверов, контейнеризацию, CI/CD и это только малая часть того, что нужно знать и уметь.

В своих проектах я применяю CI/CD для проверки кода линтером, тестирования (если написаны тесты), сборки и деплоя. На любом из этих этапов может произойти ошибка, и если GitHub уведомляет по почте, то собственный git на базе Gitea так не делает (или я не разобрался), тем не менее, уведомления на почту не очень удобны. Тогда я задался вопросом оповещений в Telegram, что позволит оперативно реагировать на события в пайплайнах.

Было найдено несколько готовых решений с разным уровнем функциональности, однако, только один из них поддерживал отправку в топики супергрупп. Тогда я решил, что неплохо бы написать свой Action.

Но на чём его писать? Можно бы было на Python, но я и так всё пишу на нём, хотелось "чего-то нового" и я стал выбирать между GoLang и Rust. Оба языка набирают популярность и имеют свои сильные и слабые стороны. Уж не знаю почему именно, но я выбрал для решения этой задачи Rust.

Начал "как водится", с чтения официальной книги по Rust. Она хорошо написана, но просто так, читая книгу что-то выучить трудно и я решил параллельно начать писать. В процессе, количество открытых вкладок поисковиков, Stack Overflow и других сайтов росло в геометрической прогрессии, это не считая вопросов, которые я задавал чату GPT, прося его объяснить мне в максимальных подробностях.

Результатом стала программа для выполнения в среде GitHub (и не только) Actions под названием Telegram Notify Action. Программа, при срабатывании триггера (они могут быть разные, например always, как понятно из названия, срабатывает всегда, а failure, только при сбое) получает данные из окружения текущего workflow и формирует текст сообщения, а затем отправляет его в Telegram-бота по API.

Если вам интересно, хотите опробовать или просто поддержать поставив "звёздочку", прошу в репозиторий: https://github.com/proDreams/actions-telegram-notifier

Буду рад вашим комментариям и отзывам!

А я пойду дальше читать учебник, наверняка придётся ещё не раз рефакторить написанный код, а возможно и добавлять новый функционал.
Код на салфетке
13 декабря 2024 г. 18:00
Приветствую!

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

Фильм: Превосходство

Год: 2014

Доктор Уилл Кастер, выдающийся исследователь в области искусственного интеллекта, создает компьютер, способный собрать все знания человечества. Его спорные эксперименты делают его известным и мишенью радикальной анти-технологической группировки.

Приятного просмотра!
Код на салфетке
10 декабря 2024 г. 17:03
Хотите узнать, как сочетать asyncio и aiohttp для асинхронного веб-скрапинга?

С асинхронным кодом можно выполнять большое количество операций ввода-вывода без блокировки основной программы. В сочетании с aiohttp, это может существенно ускорить веб-скрапинг.
import asyncio
import aiohttp

urls = [
    'https://example.com/',
    # ... список URLов
]

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            tasks.append(fetch(session, url))
        pages = await asyncio.gather(*tasks)
        for content in pages:
            process(content)

def process(content):
    # Логика разбора страницы
    pass

if __name__ == '__main__':
    asyncio.run(main())

asyncio.gather запускает задачи параллельно
aiohttp.ClientSession переиспользует соединения для эффективности
async with обеспечивает корректное закрытие сессий и соединений
Код на салфетке
9 декабря 2024 г. 11:00
Привет, друзья!

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

Понедельник (02.12.2024) Дайджест за предыдущую неделю

Вторник (03.12.2024) Хотите узнать, как использовать SElinux для повышения безопасности в Linux?

Четверг (05.12.2024) Сравнение улучшения кода в Python и C++ (часть 1)

Пятница (06.12.2024) Пятничный кинорелакс

Суббота (07.12.2024) Задача

Воскресенье (08.12.2024) Разбор задачи

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

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
Код на салфетке
8 декабря 2024 г. 18:20
Вчера мы задали задачу, похожую на Задачу №46, но с небольшим отличием. Задачу решило 5 человек из 15-ти проголосовавших. Давайте резберём правильный ответ.


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


Код задачи
def filter_dict(data: dict[int, int]) -> dict[int, int]:
for key in list(data.keys()):
if key % 2 == 0:
data[key + 1] = data.pop(key) * 2
return data

data = {1: 10, 2: 20, 3: 30, 4: 40}
result = filter_dict(data)
print(result)



Разбор кода:
1. Функция filter_dict принимает словарь data с ключами и значениями типа int.

2. Цикл for key in list(data.keys()) проходит по всем ключам словаря.

- Здесь используется list(data.keys()), чтобы создать список ключей, так как мы будем изменять сам словарь data в процессе итерации. Если бы мы проходили по data.keys() напрямую, это могло бы вызвать ошибки.
3. Внутри цикла для каждого ключа проверяется, делится ли он на 2 без остатка (key % 2 == 0). Это условие выделяет чётные ключи.

4. Если ключ чётный, выполняется модификация:

- Значение по этому ключу удваивается (data.pop(key) * 2) и присваивается новому ключу, который равен key + 1.
- Метод pop удаляет старый ключ из словаря и возвращает его значение.
5. По завершении цикла функция возвращает модифицированный словарь.

6. В основной части программы передаётся исходный словарь data, а результат работы функции выводится через print.


Правильный ответ: {1: 10, 3: 40, 5: 80}


Как это работает?
Разберём пошагово, что происходит с данным словарём {1: 10, 2: 20, 3: 30, 4: 40} при прохождении через функцию:

1. Итерация 1:
Ключ 1 (нечётный). Условие key % 2 == 0 не выполняется, пропускаем этот ключ.
2. Итерация 2:
Ключ 2 (чётный).

- Выполняется data.pop(2) → удаляем ключ 2, возвращаем его значение 20.
- Новый ключ 2 + 1 = 3. Присваиваем значение 20 * 2 = 40 новому ключу 3.
Теперь словарь выглядит так: {1: 10, 3: 40, 4: 40}.
3. Итерация 3:
Ключ 3 (нечётный). Условие key % 2 == 0 не выполняется, пропускаем.
4. Итерация 4:
Ключ 4 (чётный).

- Выполняется data.pop(4) → удаляем ключ 4, возвращаем его значение 40.
- Новый ключ 4 + 1 = 5. Присваиваем значение 40 * 2 = 80 новому ключу 5.
Теперь словарь выглядит так: {1: 10, 3: 40, 5: 80}.

Цикл завершён, функция возвращает финальный словарь {1: 10, 3: 40, 5: 80}.


Почему результат именно такой?
1. Итерация по списку ключей, а не по словарю:
Мы создаём копию ключей (list(data.keys())), чтобы изменения в словаре data не влияли на процесс итерации. Без этого подхода могли возникнуть ошибки или пропуск ключей.

2. Метод `pop` и добавление нового ключа:
Метод pop удаляет чётные ключи и их значения из словаря. Удвоенное значение присваивается новому ключу (key + 1). Это приводит к замене чётных ключей на нечётные с модифицированным значением.

3. Последовательность операций:
Изменения в словаре происходят строго по порядку, так как мы проходим по изначальному списку ключей. Это исключает влияние на порядок обработки данных.
Код на салфетке
7 декабря 2024 г. 11:52
Что выведет код с изображения? №47
Опрос
  • {1: 10, 3: 30, 5: 40, 7: 80}
  • {1: 10, 3: 30, 5: 40}
  • {1: 10, 3: 40, 5: 80}
  • {1: 10, 2: 20, 3: 30, 4: 40}
  • RuntimeError
Код на салфетке
7 декабря 2024 г. 11:51
Что выведет этот код? №47

Задача:
Вы пишете функцию, которая выполняет фильтрацию и модификацию словаря на основе вложенных условий. Чтобы упростить логику, вы решили использовать итерацию по ключам словаря и изменять его "на лету". Что получится в результате выполнения написанного кода?
Код на салфетке
6 декабря 2024 г. 18:00
Приветствую, друзья!

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

Фильм: Живое

Год: 2017

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

Устраивайтесь поудобнее. Всем приятного просмотра!
Код на салфетке
5 декабря 2024 г. 11:34
Сравнение улучшения кода в Python и C++ (часть 1)
Автор: Eugene Kaddo

Данная статья посвящена теме улучшения кода в языках Python и C++, а именно обработке ошибок, валидации, аннотациям типов, повышению отказоустойчивости и переиспользованию кода.


Читать постЧитать пост

Файлы к посту, можно получить в боте по коду: 108905

Поддержать проект на Boosty
Поддержать проект в Telegram

#exception #Cpp #Сравнение_Python_и_C_Cpp #annotation #validation
Код на салфетке
3 декабря 2024 г. 17:01
Хотите узнать, как использовать SElinux для повышения безопасности в Linux?

Security-Enhanced Linux (SELinux) предоставляет механизм принудительного контроля доступа (MAC), который ограничивает права процессов и пользователей.

Проверка статуса SElinux:
sestatus

Изменение режима работы:
sudo setenforce Permissive  # или Enforcing


Создание пользовательской политики:
1. Запустите приложение и соберите ошибки SElinux в /var/log/audit/audit.log
2. Создайте модуль политики:
sudo audit2allow -a -M mypolicy

3. Установите модуль:
sudo semodule -i mypolicy.pp


- audit2allow
автоматически генерирует правила на основе логов (генерируемые правила audit2allow могут быть слишком широкими, поэтому их важно анализировать перед применением)
- semodule управляет модулями политик

Важно помнить, что хоть SElinux и помогает предотвратить несанкционированный доступ и повышает общую безопасность системы, он требует правильной настройки и даже с ней – это не панацея.
Код на салфетке
2 декабря 2024 г. 11:01
Привет, друзья!

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

Понедельник (25.112024) Дайджест за предыдущую неделю

Вторник (26.11.2024) Хотите разобраться в основах сетей Docker и как связывать контейнеры?

Среда (27.11.2024)

Четверг (28.11.2024) Бесплатный аналог ChatGPT на своём ПК

Пятница (29.11.2024) Пятничный кинорелакс

Суббота (30.11.2024) Задача

Воскресенье (01.12.2024) Разбор задачи

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

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
Код на салфетке
1 декабря 2024 г. 18:16
Вчера мы предложили вам довольно простую задачу, в котором за, казалось бы, сложными операциями, скрывается сама простая ошибка. Задачу решило из проголосовавших человек. Давайте резберём правильный ответ.

Задача:
Вы экспериментируете с оптимизацией обработки данных. В представленном коде для фильтрации списка чисел используется вложенная функция и модификация самого списка во время его обработки. Цель задачи — понять, как работает данный код, и выяснить, какой результат будет выведен на экран.

Код задачи:

def process_data(data: list[int]) -> list[int]:  
def modify_and_filter():
for i in range(len(data)):
if data[i] % 2 == 0:
data.pop(i)
yield i

indices = list(modify_and_filter())
return indices + data


data_lst = [1, 2, 3, 4, 5, 6]
result = process_data(data_lst)
print(result)



Разбор кода
Давайте разберём этот код построчно и посмотрим, что происходит.

Функция process_data
Это основная функция, принимающая список целых чисел data и возвращающая обработанный результат.

Вложенная функция modify_and_filter
Эта функция должна:

1. Проходить по индексам списка data.
2. Проверять, является ли элемент чётным.
3. Если элемент чётный:
- Удалять его из списка (data.pop(i)).
- Возвращать индекс удалённого элемента (с помощью yield).

Ключевой момент: modify_and_filter — это генератор, так как она использует yield. Вызов этой функции не выполняет её код сразу, а создаёт генераторный объект, выполнение которого начинается только при итерации.

Цикл for i in range(len(data))
Цикл проходит по индексам от 0 до len(data) - 1. Внутри цикла вызывается data[i] для проверки условия.

Проблема: Во время работы цикла список data модифицируется. Это влияет на длину списка и смещение элементов, что приводит к несогласованности индексов.

Удаление элемента data.pop(i)
Удаление элемента приводит к изменению длины списка и смещению индексов остальных элементов. Например, если удалить элемент с индексом 1, то элемент с индексом 2 станет на место элемента 1, а длина списка уменьшится.

Генератор возвращает индексы
Функция modify_and_filter возвращает индексы удалённых элементов в процессе итерации.

Возврат результата
Функция process_data создаёт список из всех возвращённых генератором индексов (indices) и объединяет его с текущим состоянием списка data.

Правильный ответ: IndexError

Почему возникает ошибка IndexError?
Рассмотрим, что происходит при выполнении программы:

1. data_lst = [1, 2, 3, 4, 5, 6].
2. Вызов process_data(data_lst) запускает modify_and_filter.
3. Внутри генератора:
- На первой итерации i = 0, проверяется data[0] (значение 1). Условие не выполнено, идёт следующая итерация.
- На второй итерации i = 1, проверяется data[1] (значение 2). Условие выполнено:
- Удаляется data[1] (pop(1)), список становится [1, 3, 4, 5, 6].
- Возвращается i = 1.
- Следующая итерация пытается проверить data[2], но из-за удаления индексы изменились: на месте data[2] сейчас стоит 4, а длина списка уменьшилась. Попытка доступа к несуществующему индексу приводит к IndexError.

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

1. Не модифицировать список внутри цикла, итерирующегося по нему.
2. Использовать копию списка или собирать данные для изменения в отдельную структуру.

Модификация списка — распространённая ошибка новичков, но с пониманием устройства циклов и индексов её легко избежать.
Код на салфетке
30 ноября 2024 г. 11:56
Что выведет код с изображения? №46
Опрос
  • [1, 3, 5]
  • [0, 2, 4, 1, 3, 5]
  • [1, 3, 5, 0, 2, 4]
  • [1, 2, 3, 4, 5, 6]
  • IndexError
Код на салфетке
30 ноября 2024 г. 11:56
Что выведет этот код? №46

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

Посмотрите на код и скажите, что он выведет?