Сайт на Wordpress
Жители планеты, подскажите связку плагинов, а так же хорошие языки программирования, хочу запилить сайт на хостинге вордпресс, да и вообще сделать парочку собственных сайтов, уже все продумал, стилистику, тематику сайта, но вот сам скелет сайта, на чем он должен быть написан, пока еще не продумал.... Какие ваши предложения(?)
Своя игра под Android за ночь
Давно хотел написать простую игрушку на телефон для себя, да и так, чтоб можно было друзьям показать, потыкать.
В мобильной разработке довольно давно, так что как делать хорошо понимаю, а вот что делать… С этим всегда проблемы. Обычно работает так: есть люди, которые говорят: «Давай сделаем так для того, чтобы что-то». Потом приходят дизайнеры и говорят: «Выглядеть оно должно вот так». Ты садишься и делаешь. Довольно часто в голове проскакивают мысли из разряда:
А почему мне не сделать свое приложение?
Зачем мне все эти промежуточные звенья?
Хочу сам решать как и что
И вот тогда, полный энергии и запала ты садишься и… И все. Упираешься в то, что у тебя нет идей. Появилась идея? Тогда ты понимаешь, что дизайнер из тебя никакой. Приходит осознание, что наверно, все эти люди есть не просто так. Возвращаешься на работу и делаешь чужой проект дальше, и так по кругу.
Несколько дней назад я ложился спать и подумал, что слишком часто в последнее время вижу, что знакомые играют в игры по типу «отгадай что за слово за N попыток», как у желтого банка была игра «5 букв» или что-то такое. И тут я понял, что сделать ее - не стоит ничего. Тут же взял ноутбук и начал.
План написания приложения был примерно следующий:
Найти в открытом доступе файл с существительными на английском языке, из которого, собственно и будут браться слова
Написать свою клавиатуру - главный по сложности виджет в этом приложении
Написать форму для ввода слов
Добавить элемент монетизации (конечно, куда же без этого)
Выложить в открытый доступ
Итак, поехали. 1 этап прошел довольно быстро и безболезненно, но со своими приколами. Я нашел список слов, состоящий примерно из 1800 существительных, но как оказалось позже, в нем очень много пробелов и довольно часто нет очевидных слов. Но и ладно, для старта подойдет.
Идем дальше. Чтобы написать клавиатуру, надо понять, в каком состоянии могут быть буквы. В целом, достаточно посмотреть пару примеров и Делаем вывод, что состояния может быть 3:
Эту букву мы еще не пробовали
Пробовали, но в загаданном слове такой нет
Пробовали и да, такая буква есть
Выбираем цветовую палитру. Мне лично, очень нравится, как выглядят салатный и оранжевый на сером фоне. Так давайте так с сделаем. С ними еще и голубой будет норм смотреться. Для клавиатуры основным цветом выбираем салатовый. Главной кнопкой аля SPACE сделаем проверку введенного слова. Если букву не угадываем - убираем обводку, если угадываем - добавляем цвета в фон. Получается что-то такое, вроде даже смотрится.
Клавиатура
Поехали дальше. Форма для ввода слов. Тоже долго не думаем, каждая буква в отдельной ячейке, при проверке слова сначала проверим, что все буквы введены, затем проверим, что введенное слово есть в нашем словаре, ну и наконец, по одной букве сравним то, что ввел пользователь с нашим загаданным (взятым рандомно из списка) словом. По состоянию, каждая ячейка для буквы может быть в одном из следующих состояний:
Еще не проверяли
Такой буквы нет в слове
Буква есть, но она не на своем месте
Да, ты угадал! Ровно эта буква и ровно здесь!
По цветам, в целом, возьмем все те же, но добавим еще немного серого для букв, которые нам не подходят. Смотрите, получается что-то такое:
О, это конец?
Казалось бы, готовая игра. Но нет, давайте добавим немного информации для пользователя, не всем же очевидно, что эти цвета вообще значат. В процессе написания, кстати, название просто всплыло в голове и начальный вариант я оставил без изменений: "Worder World". Как вам? Типа Wonder - WORDer, ну вы поняли. Отвлеклись, итак, добавляем кнопку инфо и немного разъяснений в виде попапа. Получается так:
Немного понятней стало
Так, а в чем моя игрушка будет отличаться от большинства других? У меня есть словарь, но правда ли я буду использовать в нем только 5-и буквенные слова? А зачем? Давайте добавим возможность пользователю самому выбирать какой длины слово он хочет. Добавляем стартовый экран с выбором длины. От 5 до 8 как будто должно хватить. А вот и идеальное место, где можно получить профит. 5, 6 - бесплатно, хочешь сложнее - плати)) Почему бы и нет, да и все равно игрушка моя, хочу так и все тут.
Выбираем сложность
Получается вот так. Вкладка магазина возможно получит жизнь в будущем, если есть идеи что туда добавить - пишите.
Финальный штрих - добавим стартовый экран загрузки с простой анимацией и немного рекламы (Правда совсем чуть чуть, да и почему нет, все равно с нее заработок измеряется в десятых частях центов). Сделаем попапы о выигрыше или проигрыше да и в целом все, игра готова.
Ну что ж, пошли выкладываться в стор. Аккаунт разраба есть, название есть, описание накатаем, скриншот наделаем, формочки необходимые заполним, отправляемся на модерацию. Что по времени? Прошло часа 3, а внутренний владелец собственной игрушки рад) Всем спасибо, если вдруг захотите посмотреть - вот ссылочка https://play.google.com/store/apps/details?id=com.agamatech...., если находите слова, которых нет в моем не очень большом словаре, или вы придумали, что крутого можно туда добавить - пишите, сделаем!
А как проходят ваши ночи?
Пишем интернет-бота при помощи джавскрипт на примере авторизации на Пикабу
Всем доброго времени суток! Как-никак, а шило кое-где есть, поэтому недавно познакомился с красивой-прекрасной библиотекой playwright. Ее, вообще, для тестирования используют. Проверять, как работает сервис. Но отдельно у нее есть апишка, которая позволяет отдельно, вне тестирования, запускать процесс браузера и совершать действия внутри него.
Автоматизировать можно все, что угодно. Все, что делает человек в интернете, в браузере, с этой библиотекой можно автоматизировать. В этом обзоре напишу короткую программу, которая заходит на аккаунт в Пикабу.
Технологии, которые нужно понимать перед началом:
JavaScript
Node JS
NPM
Создаем проект и устанавливаем зависимости
Сначала создаем папку pikabu в любом удобном месте.Внутри папки открываем терминал\любой редактор кода с терминалом, вводит следующие команды:
npm init -y
npm i playwrightnpx playwright install
Когда все готово, создаем файл index.js в корне каталога.
2. Работаем с браузером и учим робота вводить данные
Импортируем chromium из playwright
Создаем контекст браузера, создаем новую страницу.
Абсолютно все команды в библиотеке асинхронные и возвращают промисы. Поэтому отвечаем им await.
Значение headless в инициализации браузера отвечает за то, появится ли UI браузера при запуске программы. При тестировании ставим false, когда программа готова - true
Отправляем нашу программу на главную страницу Пикабу:
И запускаем программу при помощи node index.js
Результат:
Открывается браузер, открывает пикабу, висит, ничего не делает. Все работает!
3. Взаимодействуем со страницей
Чтобы научить нашу программу общаться с сайтом, нужно выделить элементы по их уникальным чертам и дать команду программе с ней взаимодействовать.
В данном случае нам нужна форма авторизации.
Чтобы узнать уникальный идентификатор элемента открываем в браузере инструменты разработчика, кнопкой f12. Выделяем нужный элемент и смотрим атрибуты, которые принадлежат только ему.
инпут с логином можно найти через идентификатор input[name="username"], а с паролем - input[name="username"].
Пропишем код, который позволит программе найти эти инпуты:
Перед тем, как определять какие-то элементы, всегда стоит ставить таймаут. Страница загружается, и эти элементы еще могут не появиться в браузере и программа их просто не сможет найти. По опыту - пять секунд нормально, но для процессов авторизации или перехода может потребоваться больше, в зависимости от самого сайта.
Инпуты получили и можем их заполнить:
Включаем программу:
Инпуты заполняются, но форма не передается. Нужно определить кнопку, которая запустит процесс авторизации и нажать на нее:
дополняем инструкцией, чтобы браузер закрылся:
Пробуем:
Поздравляю! Программа написана, она сама открывает браузер, вводит данные в инпуты авторизации, и входит на Пикабу.
Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset)
https://habr.com/ru/articles/783352/ - Оригинал
Камеры видеонаблюдения стали для многих стран обыденностью, например в Китае, они могут свисать гроздьями, через каждые 5 метров, по улице. Но в провинции России это все еще может быть в новинку. Я отношусь к видеонаблюдению по большей мере положительно. Ведь вид камеры, даже превентивно может предотвратить хулиганство (однажды я использовал муляжи камер в офисе:)), а главное это возможность контролировать объект наблюдения.
Этот пост про монтаж уличной камеры, на стену многоквартирного дома и программную реализацию - вывод изображения, без использования стандартной программы, оптимизацию, для размещения на raspberry pi.
Монтаж
Коробка
Внутри помещения, я уже успешно использовал камеры фирмы vstarcam, по этому, лояльное отношение, подтолкнуло сделать заказ на али vstarcam CS64. Забегая вперед скажу, что это не лучший выбор - мыльная картинка, как будто нет даже заявленных 3 МегаПикселей.
План таков: повесить на внешнюю стену электрическую распределительную коробку, внутрь нее поместить блок питания, на крышку прикрепить камеру. Сигнал передается по wi-fi, питание - провести кабель через раму окна.
Примерный бюджет: ip-камера 3500р., коробка 600р., винтики-гаечки (продаются в леруа на развес) 5р., кабель/вилка/клеммы 200р.
Порядок работ:
Блок питания закинут в коробку(не стал его там крепить), отрезан кабель питания. На клеммы прикрутил новый кусок кабеля(брал его с запасом, но в итоге понадобилась только половина), кабель вывел из коробки;
В крышке коробки(она съемная), просверлил 4 отверстия и закрепил на ней камеру болтами с гайками;
Вылез из окна во внешний мир и под окном просверлил отверстия в стене, вбил дюпеля. Прикрутил открытую коробку, из которой, пока что, болтается моток кабеля.
Взял крышку с камерой, продел и подключил внутрь коробки кабеля(питание и не нужный lan), закрыл крышку, таким образом смонтировав камеру.
Просверлил в пластиковой раме окна отверстие наружу и всунул в него кабель питания, положил кабель канал, обрезал кабель до нужной длины и прикрутил вилку. Получилось довольно сурово, но это и к лучшему :)
Улица
Мотивом для дальнейшей части повествование было желание поделится с соседями видом со стены, ну и желание разобраться как захватывать видеопоток. Не было желания объяснять старшему поколению, как работает стандартное приложение eye4, по этому я решил реализовать веб страничку. Деплой будет на, уже обитавшую для домашних проектов, raspberry pi 4 4Gb.
В спецификации камеры было указано что она умеет в rtsp, его и выбрал. ip адрес камеры было просто вычислить в настройках маршрутизатора и задать его статичным. Предварительно надо было получить ссылку на видеопоток - а его нет! Я аж вспомнил nmap, а то мало ли с портом промахнулся. В документации нет ни слова, оказывается, в отличии от предыдущих моделей, в программе eye4, зайдя в настройки камеры надо включить опцию "незащищенный пароль". И как то напахнуло старыми китайскими девайсами, с непонятными настройками.
eye4
Итоговая ссылка rtsp://admin:password@192.168.0.119:10554/tcp/av0_0
Можно проверить ее подключившись например vlc
Пароль задавался в фирменной утилите.
Код
Программная часть будет использовать python (не судите строго, только год приручаю питона:)). Веб фреймворк Flask был выбран из-за простоты (для одностраничника больше и не надо); Для оптимизации, захват и генерацию кадров было решено разделить на разные процессы, с помощью multiprocessing (в надежде, что это поможет хилому rpi); Для захвата кадров видеопотока и их кодирования, оказалось лучшим вариантом будет использование библиотеки OpenCV.
Непосредственно код:
Файл скрипта на питоне webstreaming.py: (См. Оригинал)
Файл шаблона templates/index.html: (См. Оригинал)
Шаблон, состоит из нескольких тегов хтмл и думаю в объяснении не нуждается, по скрипту пройдемся более детально.
Здесь фласк приложение, при открытие страницы клиентом, обращается к генератору кадров, который выбирает изображение, постоянно создаваемое в отдельном процессе, захватывая видеопоток камеры.
Кеширование реализовано с помощью глобальной переменной last_frame, которая для обмена между процессами представляет из себя manager(данные внутри обернуты в list, так как это условие его использования). Это позволяет не генерировать для каждого нового клиента уникальные данные, они смотрят одни и те же картинки, не увеличивая нагрузку.
Сначала запускается процесс p, это позволит параллельно создавать кадры, не нагружая основной процесс.
Далее запускается фласк приложение app.run. Блок try, я добавил для того что бы нормально обработать ctrl-c в терминале. По его завершению, происходят методы завершения созданного процесса.
Функция создания кадра cache_frames. Именно в ней происходит основная нагрузка, которую надо оптимизировать, для маломощного одноплатника. Будем резать качество! Если у Вас будет довольно мощный сервер, вероятно не стоит повторять все советы(оставив хотя бы нормальное разрешение). Для начала я пробовал снижать частоту кадров, это приводило к появлению старых кадров и очевидному замедлению воспроизведения. Обнулить буфер камеры в VideoCapture можно только вытащив из него все кадры. Запускать cap.grab() в цикле это действенный механизм, но это приводит к недопустимой для меня нагрузке. В моей камере есть второй поток с более низким разрешением, это позволило снизить разрешение без cv2.resize, что существенно уменьшило нагрузку, позволив оставить штатную частоту кадров камеры. Все эти моменты могут различаться в разных моделях камер. Давайте пройдемся по строкам главной функции. Сначала мы открываем видеопоток(cap) и узнаем какой у него fps. Далее идет цикл в котором мы читаем кадр(cap.read). Закомментирована строка с изменением размера, так как удалось это сделать на стороне камеры. Далее происходит кодирование в jpeg, с уменьшением качества(imencode). По итогу мы преобразуем массив в необработанную строку байтов, так как именно такой результирующий вид требуется, и размещаем в наш кеш last_frame. Цикл каждый раз засыпает, что бы снизить нагрузку, интервал чуть выше фпс, что бы вычитывать все кадры из буфера камеры. По выходу из цикла ресурсы видеопотока будут освобождены(release).
Функция generate, при подключении клиента, генерирует хттп mjpeg ответ изображения с кадрами из кеша, который будет отображаться в браузере.
Вы можете заметить, что здесь нет работы над стабильностью. Например если соединение с камерой пропадет на время, скрипт просто сломается и такие ситуации надо обрабатывать.
Так же стоит провести работу по адаптации для нормального wsgi сервера. Это сделано, что бы не раздувать текущий текст и на своем гитхабе я постараюсь выложить доработанную версию.
Перекинув файлы на распберри пай и запустив их, нагрузка составила:
Я посчитал, что чуть более 20% использования cpu(BCM2711), хороший результат, не стеснит остальные проекты.
Осталось только пробросить порт на маршрутизаторе и можно делиться видео наблюдениями. Соседи рады, я рад :-)
Этот текст я написал, так как увидел скудность ру доков по rtsp+python. Возможно кого то это мотивирует на эксперименты с наблюдением и обработкой видеозахвата:) Всем удачи!
Как получить пожизненную лицензию: WebSite X5 Evolution 13?
— ПОЛУЧИТЬ | 5 399₽
💁🏻♂️ WebSite X5 Evolution 13 — это ПО для дизайна и создания веб-сайтов, блогов и интернет-магазинов. Вы можете легко создать безопасный, отзывчивый, профессиональный и полноценный веб-сайт, выполнив множество простых шагов, в том числе с помощью ИИ. Кроме того, WebSite X5 Evo имеет встроенные расширенные инструменты для поисковой оптимизации, а также адаптивный дизайн, который позволяет вашим веб-страницам адаптироваться к разрешению экрана любого устройства.
↘️ WebSite X5 Evo прекрасно подойдет тем, кто не имеет навыков программирования и предпочитает визуальные методы работы без необходимости ломать голову над кодами. Никакой абонентской платы, ни комиссии: лицензия включает хостинг и позволяет создавать любые сайты для себя и других.
Обзор возможностей:
🤷🏻♂️ Как получить пожизненную лицензию:
1. Регистрируемся по этой ссылке.
└ Отлично, подтверждаем почту
2. Теперь переходим по этой ссылке.
└ Копируем ключ для активации
3. Открываем раздел » License Keys.
└ Вводим скопированный ключ
4. Готово, лицензия активирована.
└ Нажмите, чтобы загрузить ПО
5. Теперь нужно установить ПО.
└ Входим, используя почту и ключ
6. Отлично, можете пользоваться.
Источник: t.me/freehvb/6313
Вопрос программистам, без рейтинга
Добрый день, болезные!
Я могу примитивно программировать, но где брать информацию.
К примеру, я хочу сформировать таблицу в екселе.
Обычный цикл for (i), дальше лист формируется из нескольких, к примеру, в первом листе берёт наименование, ищет строку в другом листе, которая содержит это же наименование, дальше, если находит берёт, к примеру, второй столбец из этой найденной строки. И т.д.
Но я не могу найти, в каком формате мне написать что я проверяю строку (i)
Например,
for (i=1; i<10;i++)
check(B%i)##? как узнать, какой знак вместо процента?
Как читается файл, нужно ли мне преобразовать екселевский файл в csv или большинство языков могут по умолчанию понять этот формат?(интересуют питон, бейсик или с)
Гайд - импортируем CKEditor 5 в Laravel 10 как модуль node.js
Всем привет!
Уже давно настала эра WYSIWYG - редакторов текстов, и при написании наших веб проектов мы конечно же стараемся их использовать по максимуму.
Один из таких редакторов ну просто с сумасшедше-огромной функциональностью - это небезызвестный CKEditor, который недавно (шучу, давно уже) зарелизился замечательной 5-й версией.
Ее мы сегодня и будем импортировать в наш проект на Laravel 10. Скриншотик (и пасхалочка, кто знает тот поймет) внизу.
Как обычно есть 2 пути - простой и сложный.
Простой - это просто прописать в шаблоне
<script src="https://cdn.ckeditor.com/ckeditor5/40.0.0/classic/ckeditor.js"></script>
И активировать его на textarea через ClassicEditor.create().
Но есть нюанс.... что если авторы решат уйти из РФ и ограничит доступ? Или же РКН решит что "ты не пройдешь!" и ... ты не пройдешь. Нужно любить всех своих пользователей, а не заставлять их расчехлять VPN потому что на сайте не работает редактор.
Да и мы ведь серьезный проект пишем! Нам нужно свое! Да еще и желательно с кастомным билдом под наши задачи!
По этому мы пойдем по второму пути - сложному, который делится еще на два.
Назовем их "следовать инструкциям" и "догадаться самим".
Но перед тем как начать - нам нужно собрать кастомный билд с нужными нами модулями и настройками. Что можно спокойно сделать на сайте. Я использовал билд на базе ClassicEditor, выбрал нужные мне модули в том числе и модуль watchdog на будущее (сейчас активировать его в коде я его конечно-же не буду). В общем, качаем билд и распаковываем его в "Новая папка (3)" на рабочке. Он нам понадобится, но несколько позже.
Распакованный архив с кастомным билдом
Следуем инструкциям.
По инструкции на сайте мы берем скачанный билд, копируем его в папку с проектом в директорию public\assets\ckeditor5, импортируем .js файл в blade шаблон и так-же активируем его через EditorWatchdog() или CreateEditor(). Легко и просто, и в принципе все гайды в интернете по интеграции в Laravel пишут нам что так делать правильно.
Но нас то не обманешь! У нас серьезный проект! И ведь действительно, вдруг нам потом понадобится модуль, который мы не добавили в наш билд? Пересобирать заново? Да ну его! По этому мы пойдем своим путем! Поехали!
Догадываемся сами
К нашему счастью в Laravel встроен замечательнейший инструмент под названием Node.js, который мы и будем использовать. И не только его.
Установка
Идем консолькой в папку с нашим проектом и запускаем (не забудь включить vpn)
npm install --save @ckeditor/ckeditor5-build-classic
Установка
Сразу нам устанавливается множество зависимостей, однако наш любимый Laravel 10 этот модуль сразу не увидит. Для того чтобы это исправить нам нужно сделать еще кое-что. Поехали интегрировать.
Интеграция
Нам нужно чтобы наш Laravel увидел CKEditor, да собирал его под наши нужды "на лету". Для этого мы будем использовать vite, благо он идет в составе Laravel. У авторов CKEditor для него есть отдельный модуль с названием @ckeditor/vite-plugin-ckeditor5, его и будем использовать. Также нам понадобится модуль @ckeditor/ckeditor5-theme-lark.
Снова консоль, пишем:
npm install --save @ckeditor/vite-plugin-ckeditor5
npm install --save @ckeditor/ckeditor5-theme-lark
Пока ждем установку - наливаем кофе.
Далее ищем в корне нашего проекта файл vite.config.js и вносим в него следующие строки как показано на скриншоте (слева - старый файл, справа - внесенные изменения)
import { createRequire } from 'node:module';
const require = createRequire( import.meta.url );import ckeditor5 from '@ckeditor/vite-plugin-ckeditor5';
ckeditor5( { theme: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) } ),
vite.config.js
Конфигурируем
Помните ту конфигурацию, что мы делали на сайте CKE? Она то нам сейчас и понадобится.
Открываем Новую папку (3) и в подпапке src находим файл ckeditor.ts. Это файл с настройками нашего билда. Копируем его в папку с проектом, в директорию resources/js.
Также из папки samples копируем style.css в resources/css.
И дополнительно создаем файлик editor.js - его мы и будем встраивать в наш шаблон.
Содержимое editor.js
import ClassicEditor from './ckeditor';
ClassicEditor.Editor
// Note that you do not have to specify the plugin and toolbar configuration — using defaults from the build.
.create( document.querySelector( '#editor' ), {
language: 'ru',
removePlugins: [
'MediaEmbedToolbar'
]
})
.then( editor => {
console.log( 'Editor was initialized', editor );
} )
.catch( error => {
console.error( error.stack );
} );
Для наблюдательных - я специально не использовал watchdog здесь. Импортировать его я планирую потом.
Дальше нам нужно загрузить недостающие модули.
Открываем редактором ckeditor.ts и видим вверху множество импортов.
Открываем папку "node_modules/@ckeditor" внутри проекта и ищем недостающие модули. Если такие есть - устанавливаем их через npm install --save %имя_модуля%.
В дальнейшем есть шанс получить следующую ошибку от TailWindCSS (при запуске npm run dev)
[vite:css] Nested CSS was detected, but CSS nesting has not been configured correctly.Please enable a CSS nesting plugin *before* Tailwind in your configuration.
Она вызывается из-за того, что мы используем кастомный css для ckeditor
Чтобы этого не происходило, нам необходимо в файле postcss.config.js в корне нашего проекта добавить следующие строки:
'postcss-import': {},
'tailwindcss/nesting': {},
как на скриншоте
postcss.config.js
Почти все
Нам осталось только в нашем шаблоне между тегов <head> добавить
@Vite(['resources/js/editor.js', 'resources/css/editor.css'])
И теперь любой <div> или <textarea> с указанием id="editor" будет вызван с редактором CKEditor5.
Запускаем проект через npm run dev и радуемся полученному результату!
Результат
Результат
А Вы заметили пасхалочку на скриншоте?
Все что вам осталось - это настроить дизайн редактора в css файле.
Ну и как-же без ложки дегтя - почему-то конфигурация "language: ru" не срабатывает и редактор остается английским. Возможно не хватает какого-то модуля или же что-то необходимо донастроить. Пока еще не разобрался, но в целом на данном этапе разработки это не сильно критично. Если у Вас есть идеи - welcome!
Update: С языком разобрался. Действительно его необходимо было имортировать. Для этого в ckeditor.ts необходимо вставить строку после импорта { ClassicEditor }
import '@ckeditor/ckeditor5-build-classic/build/translations/ru';
Update2: Также нашел проблему при вставке видео с внешнего источника, например Youtube. В редакторе оно вставляется, а вот в пост не переносится. Лечится доп конфигом там-же в ckeditor.ts в секцию defaultConfig
mediaEmbed: {
previewsInData: true
}
Исправленная локализация
Надеюсь что данный гайд поможет Вам в проектах.
Если вы хотите немного потрындеть, или быть может знаете Laravel или например умеете верстать, ну или просто у вас есть желание как-нибудь помочь с разработкой проекта, милости прошу в мою потрынделку.
В кратце - да, старый добрый, с блекджеком и шлюпками.
Всем спасибо!