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

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

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Мы ещё дипломы не получили, а ГБ уже предлагает сменить профессию...

Видео записал одногруппник/подписчик @mssw_wssm
😁7🤡2👀1
AIOgram3 17. Подготовка к разворачиванию на сервере
Автор: Иван Ашихмин

В одном из следующих постов в цикле "Применение Docker" мы с вами будем разворачивать бота на сервере, но перед этим необходимо кое-что подготовить.

Когда мы прописывали токен бота в посте "AIOgram3 3. Основная функция", я упомянул, что хранение в коде секретных данных небезопасно. В данном посте мы исправим это, и я покажу, как правильно передавать секреты в бота.


Переменные окружения.
🔥3👍1
Переменные окружения (environment variables) – это механизм хранения данных, который позволяет хранить конфигурационные параметры вне кода. Они обычно используются для хранения секретной информации, такой, как ключи API, пароли и токены, а также для хранения прочих параметров (пути к файлам, настройки приложения и т.п.).

Для хранения переменных окружения с их значениями мы будем использовать специальный, "скрытый" .env файл. Название файла именно так и пишется <точка>env, без каких либо расширений. Самый известный пример подобных "скрытых" файлов, это .gitignore.

Обратите внимание. В системе может быть выключено отображение скрытых файлов.

Для получения данных из переменных окружения в коде будем использовать модуль environ из встроенной в Python библиотеки os.


Файл .env.
В корневой директории проекта, там, где файл main.py, создадим .env-файл и откроем его.

Откройте рядом файл settings.py и найдите класс Secrets.
Если вы повторяли все посты, то у вас должно быть шесть полей в этом классе: token, admin_id, group_id, weather_key, audio_key_id, audio_key_secret.

Создадим в .env-файле такие же строки, но в верхнем регистре, т.к. переменные окружения принято прописывать заглавными буквами. После каждой переменной ставим равно = и копируем значение из класса Secrets. Без кавычек.

Должно получиться вот так:
TOKEN=ваш_токен  
ADMIN_ID=id_администратора
GROUP_ID=id_группы
WEATHER_KEY=токен_погоды
AUDIO_KEY_ID=id_распознавания_голоса
AUDIO_KEY_SECRET=токен_распознавания_голоса


Если вы используете git, то обязательно внесите .env-файл в .gitignore!


Получение данных из окружения и .env-файла.
Когда мы будем разворачивать бота на сервере, все данные из .env-файла будут переданы внутрь контейнера, а самого его там не будет в целях безопасности. Однако, для работы с .env-файлом на локальной машине, необходимо его прочесть и получить из него данные.

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

Для установки библиотеки необходимо выполнить команду:
pip install python-dotenv


После этого добавляем её в файл requirements.txt. Он нам понадобится во время разворачивания проекта на сервере.
python-dotenv1.0.1


Вернёмся к файлу settings.py.

В самом начале файла, сразу после импортов, вызываем функцию load_dotenv() для чтения .env-файла.
from dotenv import load_dotenv


load_dotenv()


Переходим к классу Secrets.
В нём нам необходимо заменить все значения полей на os.environ.get(""), где в кавычках указывается переменная окружения.

Обратите внимание! Если тип поля, например, int, то и значение полученное из переменной окружения нужно приводить к этому типу.

Получается так:
@dataclass  
class Secrets:
token: str = os.environ.get("TOKEN")
admin_id: int = int(os.environ.get("ADMIN_ID"))
group_id: int = int(os.environ.get("GROUP_ID"))
weather_key: str = os.environ.get("WEATHER_KEY")
audio_key_id: str = os.environ.get("AUDIO_KEY_ID")
audio_key_secret: str = os.environ.get("AUDIO_KEY_SECRET")



Завершение.
На этом подготовка закончена. Теперь на локальной машине секретные данные будут браться из .env-файла, а о том, как это будет работать на сервере, узнаете в следующих постах.
👍3🔥3
Приветствую!

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


Оглавления:
Для удобства навигации есть посты с оглавлениями по темам:

"Сайт на Django"
"Telegram-бот на AIOgram3"
"Применение Docker"
"Полезные инструменты"
"Путь в IT."
"Код в мешке"
"Boosty эксклюзив"


Ресурсы канала:

Уютный и немного безумный чат канала.
Бот с материалами к постам
Сайт со всеми постами
Канал в Dzen
Сообщество в VK


Поддержка.

Если вам нравится канал и выходящий материал, поделитесь ссылкой с людьми, кому это тоже может быть интересно.

Также поддержать канал можно на Boosty.

Или внеся сайт в исключения вашего блокировщика рекламы.
🔥3
Разворачивание Django-проекта на PythonAnyWhere
Автор: Иван Ашихмин

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

В этом посте мы развернём проект на сервисе PythonAnyWhere.

Адрес сервиса: https://www.pythonanywhere.com

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


Подготовка проекта.
Перед тем, как приступить к работе с сервисом, необходимо подготовить проект для работы.
👍21🔥1
В корне проекта, рядом с файлом manage.py, создайте файл requirements.txt, если его нет. Добавьте туда используемые в вашем проекте библиотеки в формате <название_библиотеки><версия>, например, Django5.0.1.
Также можно воспользоваться командой pip freeze > requirements.txt которая соберёт все установленные библиотеки и запишет их в файл.

Также в корне проекта создайте .env-файл. В нём будут храниться секретные данные, такие, как секретный ключ Django, данные для подключения к БД и т.д. Всё, что не следует хранить в коде.
Подробнее об этом файле рассказано в посте "AIOgram3 17. Подготовка к разворачиванию на сервере".

Для получения данных из .env-файла нам потребуется библиотека python-dotenv.
Установим её командой pip install python-dotenv и добавим в requirements.txt.


Конфигурация настроек.
Откроем файл settings.py.

В самом начале файла, сразу после импортов, добавляем вызов функции load_dotenv().
from dotenv import load_dotenv  


load_dotenv()


После переменной DEBUG добавим две переменные:
SESSION_COOKIE_SECURE = True  
CSRF_COOKIE_SECURE = True


Они нужны для повышения безопасности проекта.

В переменную ALLOWED_HOSTS добавляем два адреса: один локальный, второй адрес будущей страницы на сервисе – ["127.0.0.1", "username.pythonanywhere.com"], где вместо username необходимо указать ваш логин в сервисе.

Далее перейдём к блоку DATABASES и заменим его с настроек для sqlite на mysql:
DATABASES = {  
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": os.getenv("MYSQL_DBNAME"),
"USER": os.getenv("MYSQL_USER"),
"PASSWORD": os.getenv("MYSQL_PASSWORD"),
"HOST": os.getenv("MYSQL_HOST"),
"OPTIONS": {
"init_command": "SET NAMES 'utf8mb4';SET sql_mode = 'STRICT_TRANS_TABLES'",
"charset": "utf8mb4",
},
}
}


Для поддержки MySQL установим библиотеку mysqlclient, выполнив команду pip install mysqlclient. И сразу добавим её в requirements.txt.

Убедитесь, что STATIC и MEDIA пути у вас верно указаны:
STATIC_URL = "static/"  
STATIC_ROOT = BASE_DIR / "static/"

MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR / "media/"


Далее нам нужны следующие переменные: SECRET_KEY, DEBUG, NAME, USER, PASSWORD, HOST.
Заменяем в них значения на os.environ.get(""), где в кавычках "" указываем имя переменной окружения.
Переменную DEBUG оборачиваем в if-else конструкцию.
SECRET_KEY = os.environ.get("SECRET_KEY")  

if os.environ.get("DEBUG") == "False":
DEBUG = False
else:
DEBUG = True


Создадим соответствующие переменные в .env-файле в виде <имя_переменной>=<значение>, без кавычек.
SECRET_KEY=...  
DEBUG=False
MYSQL_DBNAME=...
MYSQL_USER=...
MYSQL_PASSWORD=...
MYSQL_HOST=...



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

Придумываем пароль и сразу вписываем его в .env-файл в переменную MYSQL_PASSWORD.
👍2🔥1
После того, как будет сконфигурирована БД, откроется страница, на которой в блоке Connecting будет две строки: Database host address и Username. Вписываем их в .env-файл в переменные MYSQL_HOST и MYSQL_USER, соответственно.

Ниже в блоке Your databases будет указано имя базы данных в формате <username>$<default>. Копируем и вписываем в переменную MYSQL_DBNAME.

Далее необходимо изменить кодировку БД с латинской на кириллическую. Для этого в блоке Your databases кликаем по имени базы данных и в открывшейся MySQL-консоли вводим, заменив username$default на имя базы данных:
ALTER DATABASE username$default CHARACTER SET utf8 COLLATE utf8_general_ci;


Должно вывести:
Query OK, 1 row affected, 2 warnings (0.03 sec)


Выходим из консоли, набрав команду exit.


Загрузка файлов на сервер.
Загрузить файлы на сервер можно разными способами, например, опубликовать проект в GitHub или загрузить архив и распаковать его.

Я выбрал вариант с репозиторием на GitHub.

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

Вводим команду:
git clone <ссылка_на_репозиторий>


Когда скачаются файлы, вводим команду для перехода в директорию проекта:
cd <имя_проекта>


Создаём и затем активируем виртуальное окружение Python:
python3 -m venv venv

source venv/bin/activate


Устанавливаем зависимости:
pip install -r requirements.txt



Настройка веб-приложения.
Переходим в раздел Web и нажимаем кнопку Add a new web app.

На экране выбора веб-фреймворка нажимаем Manual configuration (including virtualenvs). Далее Python 3.10.

После создания веб-приложения мы попадаем на страницу настройки.

Находим раздел Virtualenv и указываем путь к директории с виртуальным окружением. Если вы в точности повторяли всё, что было указано выше, то он будет таким: /home/<имя_пользователя>/<имя_проекта>/venv.

Находим раздел Code и в нём строку WSGI configuration file. Кликаем по ссылке и попадаем в окно редактирования WSGI-файла. Находим блок # +++++++++++ DJANGO +++++++++++ и удаляем всё, что находится до и после него.

Раскомментируем все строки, начинающиеся с одного символа решётки #.

Сразу после импортов добавляем загрузку .env-файла. Обратите внимание, в этой директории должен находиться .env-файл:
from dotenv import load_dotenv

project_folder = os.path.expanduser('~/<имя_проекта>')
load_dotenv(os.path.join(project_folder, '.env'))


Далее в переменной path указываем полный путь до директории проекта. Обратите внимание, в этой директории должен находиться файл manage.py:
path = '/home/<имя_пользователя>/<имя_проекта>'
if path not in sys.path:
sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = '<имя_проекта>.settings'

## then:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()


В месте, где указываем файл настроек проекта <имя_проекта>.settings, прописывайте его так, как он указан в вашем файле settings.py в переменной WSGI_APPLICATION - <имя_проекта>.wsgi.application.


Мой код файла:
👍2🔥2
# +++++++++++ DJANGO +++++++++++
# To use your own django app use code like this:
import os
import sys

from dotenv import load_dotenv

project_folder = os.path.expanduser('~/temp_project')
load_dotenv(os.path.join(project_folder, '.env'))

path = '/home/proDream/temp_project'
if path not in sys.path:
sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'pressanybutton.settings'

## then:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()



Миграции и статика.
Вернёмся в консоль с активированным виртуальным окружением. Его можно найти в разделе Consoles.
Если закрыли, то откройте снова и активируйте venv, либо на странице веб-приложения, в разделе Virtualenv нажмите Start a console in this virtualenv.

Убеждаемся, что мы находимся в той же директории, что и файл manage.py, выполнив команду ls. Если нет, то перейдите в нужную директорию командой cd.

Выполним команду миграции базы данных:
python manage.py migrate


Создаём суперпользователя командой:
python manage.py createsuperuser


И следом выполняем команду сбора статических файлов:
python manage.py collectstatic


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

На странице веб-приложения находим раздел Static files.
В блок URL вводим /static/, а в блок Directory - скопированный ранее путь.

Если в вашем проекте помимо статики используется ещё и media, укажите директорию и путь.

Завершение.
Остался последний шаг.

В самом верху страницы есть блок Reload с большой зелёной кнопкой. Нажимаем на неё и ждём несколько секунд.

После чего переходим по адресу, указанному над кнопкой Configuration for ....

В результате должна отобразиться главная страница сайта.

Поздравляю, ваш сайт доступен всему интернету по этому адресу.

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

Пост на сайте
Поддержать проект

#Python #Django #Гайды #Разворачивание #Deploy #бесплатный_хостинг #PythonAnyWhere
👍3🔥2
Всем добрейшего вечерочка пятницы!

На связи ваша любимая рубрика "Пятничный кинорелакс". Пришло время отвлечься от дел и немного отдохнуть за просмотром очередного пятничного фильма. В этот раз запасаться вкусняшками советовать не буду. Фильм хоть и комедия, однако в нём есть не очень приятные (на мой взгляд) сцены😁

Фильм: Тяжёлая поездка

Год: 2018

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

https://www.kinopoisk.ru/film/1094255/

https://www.sspoisk.ru/film/1094255/

Приятного просмотра
🔥2👍1
Что выведет код с изображения ниже?
Anonymous Quiz
26%
[2, 3]
3%
[1, 2]
34%
[1, 2, 3]
37%
[1, 3]
🔥4🤯4
Что выведет этот код? №9
👍3🔥1
Задача прошлой недели и вчерашняя задача похожи. И там, и там вся суть в поведении изменяемых типов данных... И капелька внимательности.

В викторине приняли участие 43 человека. Верный ответ оказался самым популярным! Верно ответило 16 человек, поздравляю. Вторым по популярности был третий ответ , набравший 32% ответов. Следом за ним идёт первый ответ с 26% ответов.


Код задачи:
def add_to_list(item, lst=[]):
lst.append(item)
return lst


list_a = add_to_list(1)
list_b = add_to_list(2, [])
list_c = add_to_list(3)
list_d = add_to_list(4, [])

print(list_c)



Разберём задачу.
В самом начале создаём функцию add_to_list, принимающую два аргумента:
- Обязательный аргумент item.
- Необязательный аргумент lst. В качестве значения по умолчанию установлен пустой список.

В теле функции мы добавляем в список lst значение переменной item. Затем возвращаем список.

Достаточно простая функция с несложной логикой.
После функции инициализируем четыре переменные:
1. list_a - в этой переменной вызываем функцию передав в неё только число 1.
2. list_b - в этой переменной вызываем функцию, передав в неё число 2 и пустой список.
3. list_c - в этой переменной также вызываем функцию с одним аргументом 3.
4. list_d - в этой переменной вызываем функцию и передаём число 4 и пустой список.

В конце выводим значение переменной list_c.

Что могло пойти не так?
Всё банально и просто. Python – интерпретируемый язык. Это означает, что он сперва читает файл, а потом выполняет его построчно. Т.к. функции не сразу начинают что-то делать, он их читает, инициализирует и дальше идёт по тексту пока объект функции не понадобится.

Именно так происходит и тут. Интерпретатор доходит до add_to_list и видит, что у него в качестве значения аргумента lst по умолчанию указан пустой список и создаёт его в памяти. Назовём его lst_0. Это важный момент. Конкретный список, записанный в переменную lst_0 , до конца исполнения кода останется тем самым списком по умолчанию в необязательном аргументе функции, сколько бы раз эта функция ни вызывалась дальше. Это значит, что в нём будут сохраняться результаты всех предыдущих изменений. Подробнее о том, как ведут себя изменяемые и неизменяемые типы данных, можно прочесть в [нашем посте на эту тему](https://t.iss.one/press_any_button/356).

Далее мы создаём четыре переменные:
1. list_a - передаём только число 1. В результате lst_0 имеет вид [1].
2. list_b - передаём число 2 и пустой список. Это новый список, назовём его lst_b и он имеет вид [2].
3. list_c - передаём только число 3. Поскольку не был передан список, то используется ранее созданный lst_0. В результате он имеет вид [1, 3].
4. list_d - передаём число 4 и пустой список. Это ещё один новый список, назовём его lst_d. Он имеет вид [4].

В результате у нас есть три списка:
- lst_0 = [1, 3]
- lst_b = [2]
- lst_d = [4]


Заключение.
Будьте аккуратны с использованием изменяемых типов данных в качестве значений по умолчанию. Это может сыграть с вами злую шутку в самый неподходящий момент.
👍5🔥5
С днём рождения, Андрей!
Автор: Иван Ашихмин

Сегодня 13 февраля 2024 года.. Вы наверняка спросите: "И что такого особенного в этом дне?". А я вам сейчас расскажу!!!

- День Дарвина (международный)
- День прокладывания тропинок
- День безумного желудка
- День объятий (Индия)
- День очистки компьютера (США)

А ещё, сегодня День Рождения у нашего главреда (не путать с главным вредителем, хотя это звание ему очень подходит, даже беря в расчет его характер). Так давайте все дружно поздравим его с Днём Рождения!!!


Поздравление от меня:
Когда у нас начался Python в основном блоке обучения, тогда-то я и познакомился с Андреем. Я сразу приметил его острый ум и нестандартный подход к решению задач. Затем мне довелось с ним и Владимиром поработать в команде, честно, тогда я считал себя самым глупым в нашей троице. А потом пошла Java и куча скучных курсов, от которых у Андрея пропал интерес к учёбе...
🎉7
Не так давно Андрей снова увлёкся питоном и программированием. Присоединился к некому проекту, пишет посты для канала и радует вас нестандартными задачками (которые я с первого раза так и не отгадывал).
В связи со всем вышесказанным хочу пожелать Андрею следующее:
Самого главного - здоровья твоей маленькой дочурке. Ведь дети, это прекрасно.
Ну и тебе тоже здоровья, а то как без него о дочурке-то заботиться?
Хочу пожелать или даже высказать надежу, что ты не бросишь программирование, а продолжишь учиться, развиваться и станешь отличным специалистом. Оставайся всё таким же весёлым, забавным, а порой невыносимым. И просто радуйся каждому дню.


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

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

И так, первая задача:
Кто шефа - правая рука? 
Тут знают все наверняка,
Кто машет тапком тут и там -
Ты угадай по "двум словам".

Она - угроза всем, но скажет...
Что всех поймёт и всем подскажет.
И кофе от неё не жди
Тут лишь задачи впереди...



Задача выдана, Андрей?
Чего же ты ждёшь?!
Ищи ответ и не робей,
все ждут, когда ты путь начнёшь!
Как только выяснишь Хранителя,
Пиши ему не медля!
И оказавшись в его обители,
Реши задачу разуму внемля!

Пост на сайте

#Код_на_салфетке #Код_в_мешке #День_рождения #Андрей #Главный_редактор
🎉6
Андрей долго плутал в лабиринте в поисках заветной двери, ведущей к первому Хранителю. Он знал, что первый Хранитель - это секретарь и вглядывался в символы на дверях, но всё было не то, пока не наткнулся на розовую дверцу украшенную кофейными зёрнами и тогда он понял - это была та самая дверь...


Кристина:
Поздравляю, ты открыл первую дверь! Проходи, располагайся, будешь кофе?..

Андрей:
На овсяном молоке, пожалуйста.

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


Кристина:
А теперь у меня для тебя загадка, разгадав которую ты получишь ключ и направление к следующему Хранителю. Приступим..

На нашем канале есть много разных людей, из них 5 человек изъявили желание поучаствовать в твоём поздравлении: 4 программиста и 1 музыкант. Предположим, что они встали в ряд. У них у всех разные имена. Каждый занимается своим направлением. Каждый из них пьёт свой напиток, предпочитает свое блюдо и содеpжит своё домашнее животное. Определи, кто из них содеpжит рыбок, следующий ключ находится у него/неё?

1. Владимир занимается мобильной разработкой.
2. У fullstack есть черепашка.
3. Мобильщик пьёт чай.
4. Артур стоит левее Вани, но стоят они рядом, разглагольствуют.
5. Артур пьёт кофе.
6. У того, кто ест суши, есть попугай.
7. Настя ест лазанью.
8. Третьим стоит тот, кто пьёт молоко.
9. Настя стоит первая.
10. Программист, который ест шашлык, стоит pядом с хозяином кошки.
11. Тот, кто содеpжит собаку, стоит pядом с тем, кто ест лазанью.
12. Тот, кто ест мармелад, пьёт пиво.
13. Артур любит пиццу.
14. Настя стоит pядом с мобильщиком.
15. У программиста, который ест шашлык, есть сосед, который пьёт водy.
16. Рядом с Владимиром стоит Backend-разработчик
17. QA любит кофе
18. Толик музыкант

Андрей:
Надеюсь, Артур не мой кофе пьет.
(Это не ответ)
Так, я беру пенсне, листик и бумажку. К утру будет ответ)
Попытки решить задачу на листе бумаги на который претендует дочка...
Артур
Хорошо, что не Толик. А то он суши любит…

Кристина:
Поздравляю тебя с верным ответом, теперь ты знаешь куда тебе идти дальше. Удачи.
🔥31😁1
Успешно ответив на такую нетривиальную задачку, Андрей вернулся в лабиринт. Как только он переступил порог, дверь резко захлопнулась за ним, забирая с собой ароматы кофе... И он мог поклястся, что слышал зловещий смех... Он стоял и обдумывал произошедшее - "После первого раза стало проще", подумал он и начал понимать правила игры. Блуждая по коридорам, вглядываясь в двери он заметил, что на одной из дверей шелушится на ветру видеоплёнка, а по центру приколочена большая хлопушка. Вот она" - подумал он и без капли сомнений шагнул за порог.


Андрей:
Салям алейкум, брат!
Я пришел к тебе в поисках рыбок)

Артур:
Поздравляю, ты открыл вторую дверь! Проходи, располагайся, не желаешь посмотреть со мной фильм, прежде чем мы приступим к задаче?..

Андрей:
Множество историй, коль желаешь, посмотрю.

Артур:
С днём рождения! Пусть этот день будет для тебя особенным, полным радости и счастья. Пусть исполнятся все твои мечты и желания, а каждый следующий год приносит только благополучие и успех.

Андрей:
Спасибо!

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

Первая загадка:
В комнате 53 человека. Каждый из них здоровается с каждым другим. Сколько рукопожатий произойдет?


Андрей:
А вы вообще придумали, что делать, если я ошибусь?)
Надеюсь, придумали.
1378 у меня получилось.
Воть

Артур:
Верно!

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


Андрей:
Сначала включить одну и подождать несколько минут. Выключить и включить вторую. Войти в комнату. Которая горит - включается вторым выключателем. Которая теплая из оставшихся - первым. А холодная и негорящая - третьим.

Артур:
Верно!

Третья загадка:
Кто в чате музыкой нас развлекает? 
Клиентов хает только в путь!
На синтезаторе для всех играет,
Голосовые шлёт и там и тут!


Андрей:
Это разные люди.
Голосовые - Настя шлет. А музыку - Ваня. Клиентов вообще все хают. А синтезатор - в душе не знаю. Эту загадку сложнее гуглить.

Артур:
Ахахах). Подумай ещё. Эти качества умещаются в одном человеке и ты его знаешь

Андрей:
Сначала я подумал, что Игорь Николаев. Но он не в чате.
Анатолий, палучаецца.

Артур:
Верно!🥳

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

Андрей:
Ну всё, я к нему тогда. Рахмат!

Артур:
Удачи)
🔥3
"Музыка!" - воскликнул Андрей. "Я видел дверь со скрипичным ключом!" - продолжал он. Уверенно повернулся назад и быстрым темпом направился обратно. "Где-то здесь..." - бормотал Андрей, разглядывая двери и внезапно для себя, уловил он тонкие звуки фортепьяно... Идя на звук, он становился всё чётче и вот она, дверь со скрипичным ключом. Распахнув её, его обдало сильной звуковой волной. На секунду, он даже подумал, что оглох, ковыряя пальцем в ухе, но деваться было некуда, нужно было входить.


Андрей:
Привет, Анатолий! Я к тебе за вопросом.

Анатолий:
Доброе утро путник! Дай мне секунду я где то потерял свиток
Гром и шорох из под шкафа с нотными тетрадями

Андрей:
Пригласи меня на ужин дружелюбным жестом.

Анатолий:
Поздравляю, ты открыл третью дверь! Проходи, располагайся, послушаем музыку и приступим, хорошо?..
https://music.yandex.ru/album/5788622/track/137670?utm_medium=copy_link

Андрей:
Погнали

Анатолий:
И так Андрэа, поздравляю тебя с твоим днём рождения, желаю всех благ, здоровья особенно, а дальше всё будет, что бы твои цели все были достигнуты, тост 🥂 за что? Зае**сь! Вот что бы и в жизни так было!

Андрей:
Благодарю!

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

Андрей:
Агась

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

Андрей:
Так миллион алых роз

Анатолий:
Верно!

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

Андрей:
Ну это точно не Агутин…

Анатолий:
Точно нет 😄
У тебя есть 3 подсказки которыми ты можешь воспользоваться

Андрей:
Да я слышу, там на фоне кто-то пытается подсказывать.

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

Андрей:
Зе ласт оф ас, получается?

Анатолий:
Умничка! Идём дальше

Третья загадка:
Назови имя человека у которого есть своя рок группа, но по мимо этого он еще и снялся в паре фильмов, представь себе! Музыкант и Актёр, две крайности одной сущности 😱

Андрей:
Таких не один) Джаред Лето, например, Киану Ривз, Виктор Цой. Да даже Сергей Паук Троицкий!

Анатолий:
Таак, так так, но только один правильный ответ

Андрей:
И как я должен выбрать среди такой замечательной компании одного человека?

Анатолий:
Нууу, ой слушай я проголодался, хочу котлетку, о да!

Андрей:
Джаред Котлето?

Анатолий:
Ееессс! Только никому не говори 🤫

Четвёртая загадка:
Смотри какое красивое у меня пианино, только вот сколько оно имеет клавиш? У меня 77 а по стандарту?

Андрей:
Только не говори, что 300))
88

Анатолий:
Там шутка про тракториста? 😁

Андрей:
Её в печать не пропустят)

Анатолий:
Именно, да, ты прав, 88 клавиш!

Андрей:
И 14 аккордов, видимо.

Анатолий:
А теперь последняя загадка 🤔

Пятая загадка:
Ты же знаешь самого быстроговорящего армянина в роцк-культуре?

Андрей:
Серж

Анатолий:
А полностью?

Андрей:
Танкян!

Анатолий:
Дааа!! Я и половины не понимаю что он поёт 😁

Андрей:
Половины)

Анатолий:
И так дорогой путник я тебя поздравляю с верным ответом, следующий хранитель - Настя. Удачи 🍀
🔥4
Музыкальная загадка
🔥3👻1
Андрей вышел из музыкальной комнаты, "что-то я устал" - подумал он, но впереди ещё была половина пути. Анатолий дал ему подсказку, что следующий хранитель находится в тёмной части лабиринта и что бы он был осторожен там. Андрей направился в путь. Тут и так темно, но заходя дальше становилось не просто темнее, а мрачнее. Повсюду были записки с кодом, на которых чётко виднелась одна надпись - "USER"... И он увидел дверь, всю исписанную кодом, вокруг которой висели предупреждающие таблички, одна из низ гласила "HTMLщикам вход ВОСПРЕЩЁН!!!". Деваться было некуда, он сделал глубокий вдох и переступил порог.


Андрей:
Настя, доброе утро)

Анастасия:
Привет) Поздравляю ты открыл 4-ю дверь! Проходи располагайся, нас заждался юзер, покодим и перейдем к задачке?

Андрей:
Юзера нельзя заставлять ждать!

Анастасия:
Хорошо ) Вот тебе шифр, а ключ к его расшифровке скрыт в фразе:
"Если бы этот день был пятницей, то он бы стал мистическим днём твоего рождения."

Шифр: Юшсракёхц Вэмъхясши йяы Ошмрхщхэ

Анастасия:
А пока ты отгадываешь загадку... Поздравляю тебя с Днем рождения) И желаю оставаться таким же крутым и с таким же убойным чувством юмора! Конечно же найти работу мечты и получить классный оффер 🥳

Андрей:
Следующий хранитель - это Владимир?

Анастасия:
Точно ты угадал)) Причем очень быстро

Андрей:
А юзер где? Или это Владимир?!

Анастасия:
Мы с юзером сегодня попробуем еше разок залить котикокфф на сервак

Андрей:
Мне сунуться к Владимиру?)
Или это вообще город имеется в виду? Мне пригодится Гугл.Мэпс?

Анастасия:
Ага к Владимиру)) Город это даже для нас слишком жестоко))

Андрей:
Мерси!

Анастасия:
Приходи еще юзер один скучает )
🔥2😱2