#Теория
Паттерн "Singleton"\"Одиночка"
Это порождающий паттерн, т.е. создающий экземпляр объекта.
Пример:
Используется для создания глобальной точки доступа к публичным методам\переменным класса. Этот паттерн гарантирует, что у класса будет только один экземпляр.
Для чего можно применять?
- Как подключение к базе данных. Т.е. вы из любой точки кода можете запросить данные из БД или отправить новые данные в БД.
- Точка доступа к настройкам. Т.е. получение данных от UI и возможность использовать эти данные в других классах, без прокидывания ссылок на эти классы.
- Логирование. Вместо создания нового логгера каждый раз, когда нужно что-то залогировать, мы записываем всё в один объект.
- Пул ссылок. Синглтон может быть неким хабом для хранения ссылок на объекты, к которым нужно получать доступ из других классов не создавая прямой зависимости. Например: в синглтоне хранится ссылка на Transform игрока и враги должны понимать где находится игрок, что бы добежать до него для атаки. Что бы не передавать каждый раз к новому объекту врага ссылку на Transform игрока, можно сразу прописать что бы враг брал трансформ через синглтон.
Минусы использования:
- Доступность. Это нарушение первого принципа SOLID - объект не инкапсулирован в классе, а является доступным из любой части кода
- Единственный экземпляр. Это нарушение третьего принципа SOLID - нет возможности использовать подтипы, ибо этот паттерн может быть только один.
- Отсутствие разделение интерфейсов. В синглтоне обычно не используются интерфейсы, ибо это единственный экземпляр с уникальной логикой. Это нарушение четвёртого принципа SOLID
- Зависимость на конкретики. Нарушение последнего принципа SOLID, говорего о необходимости создавать зависимости от абстракций.
- Препятствуют автоматическому тестированию - экземпляры не могут быть созданы заново для каждого тестового примера
Как видите минусов у данного паттерна достаточно, потому использование его считается не желательным, однако не считается грубым нарушением. Потому нужно хорошенько оценить насколько он необходим в вашем проекте, прежде чем его использовать.
Паттерн "Singleton"\"Одиночка"
Это порождающий паттерн, т.е. создающий экземпляр объекта.
Пример:
public class MyClass
{
public static MyClass Instance
{
get{return this;}
}
}Используется для создания глобальной точки доступа к публичным методам\переменным класса. Этот паттерн гарантирует, что у класса будет только один экземпляр.
Для чего можно применять?
- Как подключение к базе данных. Т.е. вы из любой точки кода можете запросить данные из БД или отправить новые данные в БД.
- Точка доступа к настройкам. Т.е. получение данных от UI и возможность использовать эти данные в других классах, без прокидывания ссылок на эти классы.
- Логирование. Вместо создания нового логгера каждый раз, когда нужно что-то залогировать, мы записываем всё в один объект.
- Пул ссылок. Синглтон может быть неким хабом для хранения ссылок на объекты, к которым нужно получать доступ из других классов не создавая прямой зависимости. Например: в синглтоне хранится ссылка на Transform игрока и враги должны понимать где находится игрок, что бы добежать до него для атаки. Что бы не передавать каждый раз к новому объекту врага ссылку на Transform игрока, можно сразу прописать что бы враг брал трансформ через синглтон.
Минусы использования:
- Доступность. Это нарушение первого принципа SOLID - объект не инкапсулирован в классе, а является доступным из любой части кода
- Единственный экземпляр. Это нарушение третьего принципа SOLID - нет возможности использовать подтипы, ибо этот паттерн может быть только один.
- Отсутствие разделение интерфейсов. В синглтоне обычно не используются интерфейсы, ибо это единственный экземпляр с уникальной логикой. Это нарушение четвёртого принципа SOLID
- Зависимость на конкретики. Нарушение последнего принципа SOLID, говорего о необходимости создавать зависимости от абстракций.
- Препятствуют автоматическому тестированию - экземпляры не могут быть созданы заново для каждого тестового примера
Как видите минусов у данного паттерна достаточно, потому использование его считается не желательным, однако не считается грубым нарушением. Потому нужно хорошенько оценить насколько он необходим в вашем проекте, прежде чем его использовать.
👍1
#Обзор
Поиграл на днях в новую для себя игрулю...
Grounded – выживачь от Obsidian в сеттинге фильма «Дорогая, я уменьшил детей».
В нём вам предстоит играть за ребёнка, которого уменьшила некая корпорация. Вам предстоит выяснить каким образом вас уменьшили и как вернуться к нормальному размеру.
Всё происходит на заднем дворе дома учёного, о котором так же предстоит узнать из схода сюжета.
Во время исследования на вас то и дело будут нападать местные жители: муравьи, жуки, пауки да мушки. Живности достаточно что бы вы о ней не забывали. Очень хорошо поработали геймдизы – каждые 40 сек что-то происходит: либо вы натыкаетесь на новую постройку, либо вас пытается сожрать здоровый паук, что в 2 раза вас выше. Арахнофобам не советую в это играть, хоть там и есть настройки уменьшения ужасного вида пауков.
Как выживачь вполне не плох – необходимо постоянно следить за уровнем еды и воды, однако нет необходимости во сне или отслеживании температуры, болезней и прочего и ваша смерть от голода или жажды, как и любая другая просто перенесёт вас на бузе без каких-либо дебаффов, разве что придётся бежать к своему рюкзаку за оставленными вещами.
Возможно «лишнюю» реалистичность убрали, ибо игра больше направлена на детей, а им и в реальной жизни не всем удаётся адекватно за всем этим следить (кто у нас не носит шапку зимой? 😉 ).
Ночные прогулки по травяному лесу – это отдельный хоррор. Многие животинки выходят на ночную прогулку, а атмосфера заставлять следить за каждым кустом, особенно пока на вас нет топового шмота.
Вообще сам сеттинг мне понравился, вернул в детство, когда смотрел фильм, на котором основана идея игры, да и в то время сильно увлекался насекомыми. Но малый выбор персонажей, и никто из них не похож на моё альтер эго😊
Система строительства, крафта и развития основана на геноциде – уничтожай всех, кого видишь и получишь либо еду, либо вещи. Всё что ты используешь (не считая основы для строительства) – плоть других существ, с которыми ты встречаешься.
Как итог игра стоит того, чтобы в неё поиграть, минимум из-за погружения в сеттинг и красоты микромира ну и, если хотите почувствовать себя терминатором с задачей уничтожить всё что ты видишь, чтобы построить свою цитадель из травы и грязи.
Ставлю ей 4 жопки красного муравья🐜 из 5 и то больше из-за ностальгических ощущений.
Поиграл на днях в новую для себя игрулю...
Grounded – выживачь от Obsidian в сеттинге фильма «Дорогая, я уменьшил детей».
В нём вам предстоит играть за ребёнка, которого уменьшила некая корпорация. Вам предстоит выяснить каким образом вас уменьшили и как вернуться к нормальному размеру.
Всё происходит на заднем дворе дома учёного, о котором так же предстоит узнать из схода сюжета.
Во время исследования на вас то и дело будут нападать местные жители: муравьи, жуки, пауки да мушки. Живности достаточно что бы вы о ней не забывали. Очень хорошо поработали геймдизы – каждые 40 сек что-то происходит: либо вы натыкаетесь на новую постройку, либо вас пытается сожрать здоровый паук, что в 2 раза вас выше. Арахнофобам не советую в это играть, хоть там и есть настройки уменьшения ужасного вида пауков.
Как выживачь вполне не плох – необходимо постоянно следить за уровнем еды и воды, однако нет необходимости во сне или отслеживании температуры, болезней и прочего и ваша смерть от голода или жажды, как и любая другая просто перенесёт вас на бузе без каких-либо дебаффов, разве что придётся бежать к своему рюкзаку за оставленными вещами.
Возможно «лишнюю» реалистичность убрали, ибо игра больше направлена на детей, а им и в реальной жизни не всем удаётся адекватно за всем этим следить (кто у нас не носит шапку зимой? 😉 ).
Ночные прогулки по травяному лесу – это отдельный хоррор. Многие животинки выходят на ночную прогулку, а атмосфера заставлять следить за каждым кустом, особенно пока на вас нет топового шмота.
Вообще сам сеттинг мне понравился, вернул в детство, когда смотрел фильм, на котором основана идея игры, да и в то время сильно увлекался насекомыми. Но малый выбор персонажей, и никто из них не похож на моё альтер эго😊
Система строительства, крафта и развития основана на геноциде – уничтожай всех, кого видишь и получишь либо еду, либо вещи. Всё что ты используешь (не считая основы для строительства) – плоть других существ, с которыми ты встречаешься.
Как итог игра стоит того, чтобы в неё поиграть, минимум из-за погружения в сеттинг и красоты микромира ну и, если хотите почувствовать себя терминатором с задачей уничтожить всё что ты видишь, чтобы построить свою цитадель из травы и грязи.
Ставлю ей 4 жопки красного муравья🐜 из 5 и то больше из-за ностальгических ощущений.
🔥1
#Идеи
Как часто бывает что вы прорабатываете механики во сне?
Мне сегодня приснился анализ механики отступления в пошаговой средневековой стратегии)
Суть такая при выборе бегства из боя ваши пешие солдаты закидывают в телеги свою броню и оружие, что увеличивает их скорость\дальность перемещения по глобальной карте. Однако при этом при повторном нападении им нужно потратить очки хода на то что бы добежать до повозок и одеть амуницию. Без неё они с характеристиками "крестьян".
С одной стороны это прикольный реализм, но насколько это может сломать баланс?...
Как часто бывает что вы прорабатываете механики во сне?
Мне сегодня приснился анализ механики отступления в пошаговой средневековой стратегии)
Суть такая при выборе бегства из боя ваши пешие солдаты закидывают в телеги свою броню и оружие, что увеличивает их скорость\дальность перемещения по глобальной карте. Однако при этом при повторном нападении им нужно потратить очки хода на то что бы добежать до повозок и одеть амуницию. Без неё они с характеристиками "крестьян".
С одной стороны это прикольный реализм, но насколько это может сломать баланс?...
🔥1🤔1
И так, митап Prototype...
Буду писать личное мнение о происходившем, потому не обещаю объективности.
В первую очередь понравилась организованность мероприятия, не говоря уже о темах, поднятых на лекциях.
Об организации
На улице по пути к митапу стояли (уже с утра подзамёршие) волонтёры, которые указывали путь заплутавшим гостям (надеюсь они там стояли не долго, ибо ветер был сильный). Не могу сказать, что место проведения было сложно найти, но без волонтёров у многих гостей могли быть с этим трудности, ибо вход был отдельный с торца здания.
На самом же мероприятии была охрана, которая следила за порядком и так же помогала с поиском пути до туалета (да его ещё нужно было найти).
Всем зарегистрированным гостям выдали именные бейджики (см. сообщение выше), как сказали на ресепшене – без бейджа не пускают, потому регистрация обязательна. С одной стороны, это круто, ибо приобщает к тусовке и можно вспомнить имя собеседника глянув на бейдж. С другой стороны, если не успел подать заявку – не попал на митап. Хотя я бы посоветовал сделать не подвесной бейдж, а с креплением на одежде, чтобы сразу можно было прочесть имя человека, а не опускать взгляд к животу.
Так же понравилось, что организаторы подготовили бесплатные завтрак и вечерний фуршет. Обед увы пришлось искать самому, но это мелочи.
В конце вечера началась «дискотека» с вином и шампанским, а также квизы и другие развлечения от организаторов с призами.
Когда я уходил народ уже во всю отплясывал)
О лекциях
Были подняты темы о том, что сейчас с геймдевом в России, как найти издателя и инвестиции (на мой взгляд очень актуальная тема, особенно с учётом того, что на встрече в основном были инди и стартапы). Так же был отдельный за для инди разработчиков и зал дня киберспортсменов и около того. Я лично слушал лекции как в главном зале, так и в инди, ибо мне это близко.
Ведущие по итогу лекции выбирали лучший вопрос от зрителей и награждали их за активность. Увы на вопросы было выделено не так много времени и многие не смогли задать свой вопрос спикерам.
Те, кто не смог послушать лекции по тем или иным причинам, могут посмотреть запись трансляции (огромный плюс оргам!) - https://prototype.ru
О гостях
Было, на мой взгляд, около 500 человек. Разношёрстных, но в основном молодых. Большинство из тех, с кем познакомился были либо студентами, либо только-только начали работать по профессии в стартапе или в инди команде.
Но также были и люди с опытом и те, кто уже основал свой стартап или небольшую студию.
Народ очень быстро разбился по группам и общался внутри своей малой группы весь день. К вечеру мои силы на социальную активность кончились, и я начал замечать, что народ сам не идёт на контакт. Возможно, у остальных тоже закончились силы или же это побочка работы в IT…
Итог
Мероприятие понравилось. Получил новую инфу на лекциях и успел познакомиться с новыми людьми и встретить знакомых из индустрии.
Кто не был, советую посмотреть лекции и если будет повторение митапа, то сходить)
Буду писать личное мнение о происходившем, потому не обещаю объективности.
В первую очередь понравилась организованность мероприятия, не говоря уже о темах, поднятых на лекциях.
Об организации
На улице по пути к митапу стояли (уже с утра подзамёршие) волонтёры, которые указывали путь заплутавшим гостям (надеюсь они там стояли не долго, ибо ветер был сильный). Не могу сказать, что место проведения было сложно найти, но без волонтёров у многих гостей могли быть с этим трудности, ибо вход был отдельный с торца здания.
На самом же мероприятии была охрана, которая следила за порядком и так же помогала с поиском пути до туалета (да его ещё нужно было найти).
Всем зарегистрированным гостям выдали именные бейджики (см. сообщение выше), как сказали на ресепшене – без бейджа не пускают, потому регистрация обязательна. С одной стороны, это круто, ибо приобщает к тусовке и можно вспомнить имя собеседника глянув на бейдж. С другой стороны, если не успел подать заявку – не попал на митап. Хотя я бы посоветовал сделать не подвесной бейдж, а с креплением на одежде, чтобы сразу можно было прочесть имя человека, а не опускать взгляд к животу.
Так же понравилось, что организаторы подготовили бесплатные завтрак и вечерний фуршет. Обед увы пришлось искать самому, но это мелочи.
В конце вечера началась «дискотека» с вином и шампанским, а также квизы и другие развлечения от организаторов с призами.
Когда я уходил народ уже во всю отплясывал)
О лекциях
Были подняты темы о том, что сейчас с геймдевом в России, как найти издателя и инвестиции (на мой взгляд очень актуальная тема, особенно с учётом того, что на встрече в основном были инди и стартапы). Так же был отдельный за для инди разработчиков и зал дня киберспортсменов и около того. Я лично слушал лекции как в главном зале, так и в инди, ибо мне это близко.
Ведущие по итогу лекции выбирали лучший вопрос от зрителей и награждали их за активность. Увы на вопросы было выделено не так много времени и многие не смогли задать свой вопрос спикерам.
Те, кто не смог послушать лекции по тем или иным причинам, могут посмотреть запись трансляции (огромный плюс оргам!) - https://prototype.ru
О гостях
Было, на мой взгляд, около 500 человек. Разношёрстных, но в основном молодых. Большинство из тех, с кем познакомился были либо студентами, либо только-только начали работать по профессии в стартапе или в инди команде.
Но также были и люди с опытом и те, кто уже основал свой стартап или небольшую студию.
Народ очень быстро разбился по группам и общался внутри своей малой группы весь день. К вечеру мои силы на социальную активность кончились, и я начал замечать, что народ сам не идёт на контакт. Возможно, у остальных тоже закончились силы или же это побочка работы в IT…
Итог
Мероприятие понравилось. Получил новую инфу на лекциях и успел познакомиться с новыми людьми и встретить знакомых из индустрии.
Кто не был, советую посмотреть лекции и если будет повторение митапа, то сходить)
prototype.ru
Проект Prototype
Нетворкинг-сообщество разработчиков видеоигр
👍3
#Теория
Ключевые слова static и const в С#
На языке C# ключевое слово static и const используется при объявлении методов, переменных и классов.
Static обозначает сущности, которые не могут быть повторены. Они не являются частью какого-либо экземпляра класса. Static часто увеличивает производительность программ, но делает их менее гибкими.
Реализация программного кода статического класса ничем не отличается от программного кода обычного класса за исключением двух основных свойств. В сравнении с нестатическим классом, статический класс имеет следующие свойства (отличия):
• нельзя создавать объекты статического класса;
• статический класс должен содержать только статические члены.
Разница между static и const
Static создает переменную, принадлежащую собственно типу, а не его экземплярам. А const объявляет переменную не доступную для изменения. Единственное, что их объединяет это возможность обращения к ним как из статического контекста, так и из экземпляра класса.
Одно тонкое, но решающее отличие заключается в том, что const вычисляются во время компиляции, тогда как static вычисляются во время выполнения.
Ключевые слова static и const в С#
На языке C# ключевое слово static и const используется при объявлении методов, переменных и классов.
Static обозначает сущности, которые не могут быть повторены. Они не являются частью какого-либо экземпляра класса. Static часто увеличивает производительность программ, но делает их менее гибкими.
Реализация программного кода статического класса ничем не отличается от программного кода обычного класса за исключением двух основных свойств. В сравнении с нестатическим классом, статический класс имеет следующие свойства (отличия):
• нельзя создавать объекты статического класса;
• статический класс должен содержать только статические члены.
Разница между static и const
Static создает переменную, принадлежащую собственно типу, а не его экземплярам. А const объявляет переменную не доступную для изменения. Единственное, что их объединяет это возможность обращения к ним как из статического контекста, так и из экземпляра класса.
Одно тонкое, но решающее отличие заключается в том, что const вычисляются во время компиляции, тогда как static вычисляются во время выполнения.
👍3
#Практика
URP и источники света
Столкнулся с задачей, где необходимо сделать множество источников света на небольшой площади. Unity "из коробки" сильно ограничивает количество источников. При активации новых светил, старые просто отрубаются, что вызывает ощущения нехватки энергии на их поддержание.
В URP изменения кол-ва света до неограниченного появилось не так давно с версией 2021.2.
Для этого необходимо найти asset URP-"уровень графики"-Renderer. В моём случае он назывался URP-HighFidelity-Renderer. В нём в графе Rendering изменить строку Rendering path на Deferred. И вуаля! Всё заработало!
Если хотите иметь ограничение, но изменить его значение можно поиграть с другим параметром:
Находим URP-"уровень графики" в нём параграф Lighting и меняем значение Per Object Limit (от 0 до 8). Мне этого было мало, но возможно кому-то облегчит жизнь.
Помните, что чем больше источников света, тем больше нагрузка на GPU.
URP и источники света
Столкнулся с задачей, где необходимо сделать множество источников света на небольшой площади. Unity "из коробки" сильно ограничивает количество источников. При активации новых светил, старые просто отрубаются, что вызывает ощущения нехватки энергии на их поддержание.
В URP изменения кол-ва света до неограниченного появилось не так давно с версией 2021.2.
Для этого необходимо найти asset URP-"уровень графики"-Renderer. В моём случае он назывался URP-HighFidelity-Renderer. В нём в графе Rendering изменить строку Rendering path на Deferred. И вуаля! Всё заработало!
Если хотите иметь ограничение, но изменить его значение можно поиграть с другим параметром:
Находим URP-"уровень графики" в нём параграф Lighting и меняем значение Per Object Limit (от 0 до 8). Мне этого было мало, но возможно кому-то облегчит жизнь.
Помните, что чем больше источников света, тем больше нагрузка на GPU.
🔥1
#Теория
Абстрактный класс и метод
Абстрактным классом называется класс, который содержит один или несколько абстрактных методов.
Абстрактный класс не может использоваться для создания объектов.
Как правило, абстрактный класс описывает некий интерфейс, который должен быть реализован всеми его производными классами.
Абстрактный метод языка C# не имеет тела метода и аналогичен чисто виртуальному методу языка C++.
Чем отличается абстрактный метод от виртуального c#?
Абстрактные методы используются для описания методов, которые должны иметь все производные классы, виртуальный же метод предоставляет возможность переопределить метод в производном классе (изменить поведение объекты - через них в C# реализуется классическая форма полиморфизма). Из этого стоит выходить при выборе какой вид метода (абстрактный или виртуальный) нужно использовать.
Виртуальный метод – это метод, который МОЖЕТ быть переопределен в классе-наследнике. Такой метод может иметь стандартную реализацию в базовом классе. Абстрактный метод – это метод, который ДОЛЖЕН быть реализован в классе-наследнике. При этом, абстрактный метод не может иметь своей реализации в базовом классе (тело пустое), в отличии от виртуального.
Абстрактный класс и метод
Абстрактным классом называется класс, который содержит один или несколько абстрактных методов.
Абстрактный класс не может использоваться для создания объектов.
Как правило, абстрактный класс описывает некий интерфейс, который должен быть реализован всеми его производными классами.
Абстрактный метод языка C# не имеет тела метода и аналогичен чисто виртуальному методу языка C++.
Чем отличается абстрактный метод от виртуального c#?
Абстрактные методы используются для описания методов, которые должны иметь все производные классы, виртуальный же метод предоставляет возможность переопределить метод в производном классе (изменить поведение объекты - через них в C# реализуется классическая форма полиморфизма). Из этого стоит выходить при выборе какой вид метода (абстрактный или виртуальный) нужно использовать.
Виртуальный метод – это метод, который МОЖЕТ быть переопределен в классе-наследнике. Такой метод может иметь стандартную реализацию в базовом классе. Абстрактный метод – это метод, который ДОЛЖЕН быть реализован в классе-наследнике. При этом, абстрактный метод не может иметь своей реализации в базовом классе (тело пустое), в отличии от виртуального.
👍1
Я создал свой проект-резюме, в котором привел примеры завершенных мною проектов и их описания.
Рассчитан на ПК, управление стандартное для шутеров или RPG.
Ссылка: https://ssmartproger.ru
Для удобства тех, кто предпочитает читать текст вместо ходьбы по виртуальному пространству, я приложил прямую ссылку на текстовую версию резюме (язык резюме соответствует языку проекта, выбранному в настройках).
Если у вас есть какие-либо комментарии или отзывы по поводу этого проекта, пожалуйста, оставьте их под этим постом.
Рассчитан на ПК, управление стандартное для шутеров или RPG.
Ссылка: https://ssmartproger.ru
Для удобства тех, кто предпочитает читать текст вместо ходьбы по виртуальному пространству, я приложил прямую ссылку на текстовую версию резюме (язык резюме соответствует языку проекта, выбранному в настройках).
Если у вас есть какие-либо комментарии или отзывы по поводу этого проекта, пожалуйста, оставьте их под этим постом.
👍5
#Теория
Ключевого слова partial
Разделяемые классы
Существует несколько ситуаций, когда желательно разделение определения класса.
-При работе над большими проектами распределение класса между различными файлами позволяет нескольким программистам работать с ним одновременно.
-При работе с использованием автоматически создаваемого источника код можно добавлять в класс без повторного создания файла источника. Visual Studio использует этот подход при создании форм Windows Forms, кода оболочки веб-службы и т. д. Можно создать код, который использует эти классы, без необходимости изменения файла, созданного в Visual Studio.
-При использовании генераторов источников для создания дополнительных функциональных возможностей в классе.
Пример:
Подробнее в документации: https://learn.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods
Ключевого слова partial
Разделяемые классы
Существует несколько ситуаций, когда желательно разделение определения класса.
-При работе над большими проектами распределение класса между различными файлами позволяет нескольким программистам работать с ним одновременно.
-При работе с использованием автоматически создаваемого источника код можно добавлять в класс без повторного создания файла источника. Visual Studio использует этот подход при создании форм Windows Forms, кода оболочки веб-службы и т. д. Можно создать код, который использует эти классы, без необходимости изменения файла, созданного в Visual Studio.
-При использовании генераторов источников для создания дополнительных функциональных возможностей в классе.
Пример:
public partial class Coords
{
private int x;
private int y;
public Coords(int x, int y)
{
this.x = x;
this.y = y;
}
}
public partial class Coords
{
public void PrintCoords()
{
Console.WriteLine("Coords: {0},{1}", x, y);
}
}
class TestCoords
{
static void Main()
{
Coords myCoords = new Coords(10, 15);
myCoords.PrintCoords();
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: Coords: 10,15
Подробнее в документации: https://learn.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods
Docs
Разделяемые классы и методы - C#
Разделяемые классы и методы в C# разделяют определение класса, структуры, интерфейса или метода между двумя исходными файлами или более.
👍1
С наступающим новым годом! Что б баги были в радость, а релизы в сладость!) Успехов на работе и новых достижений в личной жизни!
🎉2