Если каждое SSH-подключение тормозит на несколько секунд, со временем это выливается в часы потерянного времени. Особенно, если ты постоянно работаешь с серверами для автоматизации действий. В моём случае расшифровка SSH-ключа при коннекте занимала 4.6508 секунды – пока я не оптимизировал процесс, сократив его до 0.0261 секунды. Рассказываю, как именно.
Бенчмарк
Почему всё было так медленно
🔹 OpenSSH + пароль
Я использовал SSH-ключи в OpenSSH-формате с паролем (passphrase). OpenSSH шифрует их с помощью bcrypt (или аналога KDF) с огромным числом итераций – это круто для безопасности (хотя и другие методы не менее безопасные), но ОЧЕНЬ медленно.
Когда исполнительный сервер пытался расшифровать ключ, процесс занимал 4+ секунды.
🔹 Ключ загружался постоянно
Деплой, выполнение задач, тестирование – при каждом подключении ключ снова и снова расшифровывался. Все это дико бесило и замедляло работу.
---
Как ускорить SSH-авторизацию?
1️⃣ Перешёл с OpenSSH на PKCS8
Главный трюк – отказаться от шифрования bcrypt внутри OpenSSH и использовать PKCS8 с PBKDF2, где можно настроить разумное количество итераций или использовать дефолтные настройки
Я решил пойти простым путём, не забираться в .NET и просто сделать всё на вебе.
Страница загружается через CURL, после чего отправляется в iframe, и на него добавляется скрипт для обработки курсора и его действий.
P.S. Это самая первая демо-версия. Позже я перешёл на работу с headless-браузером, и в ходе тестов выяснилось, что всё ломается на всплывающих элементах (потому что при передаче HTML iframe не отображает выполненный в браузере JavaScript — т.е. различные всплывающие окошки и т.д.).
Поэтому чуть позже покажу новую версию и то, как я это решил 😮💨
Если вы когда-нибудь пользовались фэтсикретом (FatSecret) для подсчета калорий, то скорее всего у вас тоже подгорала жопа с того, что вы не можете без особых усилий занести в него приготовленную вами еду (состоящую из продуктов в их базе)
А даже если ее и удастся добавить, то вы не сможете ей поделиться, например, с вашим партнером, если вы живете не один и питаетесь вместе (просто потому, что там модерация и можно загружать только для всех)
После этого у меня родилась 💡идея разработки проекта, который решал бы для меня эту проблему и упростил бы процесс подсчета калорий
Отсюда появляются 2 челенджащих вопроса:
1. Как записывать «:блюдо»?
То есть это будет возможность выбора среди ранее добавленных в приложение «:продуктов» или добавление в свободной форме, типа:
Картошка [10, 5, 8] (белки, жиры, углеводы)
Морковь [……]
Сливки 20% [……]
2. Откуда взять базу основных продуктов? (овощи, самые популярные: молоко, яйца)
Первый ответ весьма простой - блюда создаем из добавленных продуктов, а процесс добавления продуктов делаем из заполнения самых базовых полей: наименование, белки, жиры, углеводы и опционально ккал
Для решения второго вопроса, в первую очередь я проанализировал все общедоступные базы/API с продуктами питания.
Все они были либо платными, либо особо бесполезными (маленькая база). У того же FatSecret’a бесплатна только база на Английском (ну спасибо ☕️) и с большими ограничениями
В итоге самым очевидным для меня решением оказался реверс инжиниринг одного из популярных приложений по подсчету калорий (не будем показывать пальцем 😁) и последующий парсинг базы всех их продуктов 😁
Как результат — спроектировал архитектуру для сбора и хранения продуктов любых типов с поддержкой брендинга (Домик в деревне, ВкусВилл и т.п.) и телеграм бота, позволяющего искать по базе продуктов и просматривать КБЖУ
В итоге получилось собрать базу КБЖУ в 170.000 продуктов
А на этом все, дальше я забил, переключился на другой проект и добро пожаловать в #замороженные_проекты
А вообще, если дойдут руки, я бы сделал небольшой каталог в виде веб-сайта с SEO и посмотрел бы, к чему это приведет
Если интересно пощупать получившийся результат, пожалуйста — ссылка на бота (https://t.me/calorytrackbot) , просто отправьте название продукта
С сегодняшнего дня я начинаю делиться процессом разработки своего сервиса для управления серверами и деплою проектов.
Страница управления пакетами
Ключевые возможности:
• Быстрое развертывание серверов: автоматическая подготовка и установка сервера, поддержка различных провайдеров (timeweb, ihor, regru и другие) (автоматический заказ услуг и дальнейшая работа с ними)
• Управление окружением: Установка пакетов и управление конфигурациями (nginx, bunker, sudo)
• Управление сайтами: простое создание и настройка сайтов с поддержкой популярных платформ: Laravel, WordPress, NodeJS
• Управление DNS: легкое управление DNS-записями через удобный интерфейс.
• Балансировка нагрузки: настройка балансировщиков нагрузки в один клик для распределения трафика между серверами.
• Уведомления: интеграция с e-mail, Telegram и другими сервисами для получения уведомлений о деплоях и событиях.
• SSL-сертификаты: поддержка Let’s Encrypt с установкой в один клик.
• Управление очередями: автоматическое создание и управление конфигурациями Supervisor для обработки очередей.
На первом этапе сосредоточусь на работе с пакетами, после чего перейду к поддержке веб-сайтов, интеграции с VCS (пока только Github), деплою и SSL.
Следите за апдейтами — впереди будет много интересного
Вы думаете, что это разный текст? А на самом деле — один и тот же. Разбираемся, что такое рандомизация и для чего она используется.
Пример рандомизации одного и того же текста для двух объявлений на Авито
Приветствую! Меня зовут Данила Справцев, я — веб-разработчик. Специализируюсь на разработке, запуске и сопровождении веб-сервисов, онлайн-платформ и ботов.
Ко мне обратился клиент с запросом разработки сервиса автоматической публикации объявлений на Авито с возможностью рандомизации любого текста.
Автоматическая публикация — дело весьма интересное и заслуживает отдельного материала 😀
В данной статье рассказываю про основополагающую по работе с любыми текстами и сервисами объявлений — рандомизацию и генерацию текстов.
Что такое рандомизация текста
Это изменение оригинального текста, путем выбора, перестановки или перебора заранее заготовленных слов по формулам
Например, если мы введем в фигурных скобках и разделим через символ "|" {Здравствуйте|Привет} после рандомизации получим один из вариантов:
Здравствуйте
Привет
Это является формулой выбора из множества
Пример генерации через случайный выбор
Возможности рандомизации
Большинство рандомизаторов поддерживают следующие формулы
{слово 1|слово 2} — случайный выбор => слово 1
[слово 1|слово 2+, +] — перестановка => слово 1, слово 2
В случае с перестановкой, между знаками + (плюс) указывается разделитель, в данном случае это запятая и пробел
И как бы на этом все, погуглив пару десятков рандомизаторов, никакого больше функционала я не нашел
В моем случае, клиент занимается товаркой и ему нужно больше возможностей применения, поэтому расширяем базу и добавляем несколько новых формул:
[буква] [БУКВА] - Случайная буква, обычно используется для артикулов
[letter] [LETTER] — случайная английская буква
[артикул] [АРТИКУЛ] — готовый артикул
[число] — цифра от 1 до 9
[от:число-число] ([от:1-999]) — случайное число в заданном диапазоне
%позавчера% — дата в формате д.м.г
%вчера%— дата в формате д.м.г
%сегодня%— дата в формате д.м.г
%завтра%— дата в формате д.м.г
%послезавтра%— дата в формате д.м.г
Случайные буквы и цифры - самый распространенный запрос функционала, которого не хватает в рандомизаторах, они позволяют уникализировать артикулы, стоимость, размерные сетки и т.п.
Как это можно применить
Допустим, у вас есть объявление с готовым текстом и вы хотите создать второе, изменив ему только обложку, но не переписывая весь текст с нуля.
И тут мы приходим к рандомизации, нам нужно создать из первоначального текста шаблон, добавить в него формулы и рандомизировать для нового объявления.
Давайте попробуем, я не буду долго выдумывать текст, в котором смогу применить все формулы, напишу буквально парочку строк для примера
Представим, что вы владеете бизнесом по производству столов в стиле лофт и составляете следующий текст для своего объявления:
Производим для Вас стoлы в стилe лофт. Мы являемся производителем продукции
Hаши cтолы пoдxoдят кaк компьютерный cтoл, письмeнный cтoл, oфиcный стол или paбочие cтолы, тaк жe oни oтлично впишутся в любой интерьeр как куxoнный стол так и обеденный стoл.
📦 Стoлы индивидуaльно зaпaкованы в коробки кoмплeктацией из: - Столешницы из ЛДСП толщиной 25мм. - Усиленного подстолья высотой 75 см с регулировкой неровностей ±2 см., фурнитура и инструкция идут в комплекте!
⚡Так же изготавливаем столешницы под любые ваши размеры, звоните и запрашивайте цены!
💴 Оплата: перевод, нал, безнал.
🎨 Цвета доступные к заказу: - Дуб табачный крафт - Дуб белый крафт - Венге - Дуб золотой крафт - Дуб серый - Дуб бронза - Аррива - Шимо светлый - Сонома - Ателье темный - Ателье светлый - Белый
В данном объявлении у нас как минимум 3 неизменяемых блока:
Размеры и цены
Варианты оплаты
Возможные цвета
Которые нам точно потребуются в новом объявлении, но если их никак не изменить, Авито может заблокировать объявлением с пометкой "Дубль"
В следствие, для этих блоков мы точно можем использовать "перестановку", легкую корректировку слов и цифр через "выбор" и "от"
По остальному тексту будем применять формулу "выбор"
Получаем следующий шаблон
{Производим для Вас|Пpедлaгaем Вам} {новые|современные|дизайнерские} стoлы в стилe лофт. {Столы пpoизводятcя на сoбcтвeннoм пpоизводствe🔥|Собственное производство🔥|Мы являемся производителем продукции🔥}
Hаши cтолы {отличнo|} {могут использоваться|пoдxoдят} кaк [письмeнный cтoл|oфиcный стол|компьютерный cтoл+, +] или paбочие cтолы, тaк жe oни oтлично впишутся в {любой|} интерьeр как куxoнный стол так и обеденный стoл.
📦 Стoлы индивидуaльно зaпaкованы в коробки кoмплeктацией из: [- Столешницы из ЛДСП толщиной {20|25}мм.|- Усиленного подстолья высотой {70|75} см с регулировкой неровностей ±[от:1-5] см., фурнитура и инструкция идут в комплекте!+ +]
🎨 Цвета доступные к заказу: [- Дуб золотой крафт|- Дуб табачный крафт|- Дуб белый крафт|- Дуб серый|- Дуб бронза|- Венге|- Аррива|- Шимо светлый|- Сонома|- Ателье темный|- Ателье светлый|- Белый+ +]
Артикул {товарного|} предложения: [АРТИКУЛ]
🤝 Ждем ваших сообщений и звонков, добавьте наше объявление в избранное что бы не потерять 🤝
Результат
Немного посидев над текстом, получаем шаблон, готовый к использованию в рандомизации для новых объявлений
Сгенерированный текст после рандомизации:
Пpедлaгaем Вам современные стoлы в стилe лофт. Собственное производство🔥
Hаши cтолы могут использоваться кaк компьютерный cтoл, письмeнный cтoл, oфиcный стол или paбочие cтолы, тaк жe oни oтлично впишутся в интерьeр как куxoнный стол так и обеденный стoл.
📦 Стoлы индивидуaльно зaпaкованы в коробки кoмплeктацией из: - Столешницы из ЛДСП толщиной 20мм. - Усиленного подстолья высотой 75 см с регулировкой неровностей ±6 см., фурнитура и инструкция идут в комплекте!
⚡Так же изготавливаем столешницы под любые ваши размеры, звоните и запрашивайте прайс-лист!
💴 Оплата: перевод, наличные, безнал.
🎨 Цвета доступные к заказу: - Аррива - Дуб табачный крафт - Дуб серый - Белый - Сонома - Дуб белый крафт - Ателье светлый - Шимо светлый - Дуб бронза - Ателье темный - Дуб золотой крафт - Венге
Артикул предложения: H6LPJCP8
🤝 Ждем ваших сообщений и звонков, добавьте наше объявление в избранное что бы не потерять 🤝
Немного фишек о формулах
Между + + (знак плюса) я использую перенос на новую строчку (энтер), чтобы каждый текст из перечисления был на новой строчке, а если мне нужно чтобы слово либо было, либо вообще не было, то использую пустой второй вариант — {1 вариант|} как в этом примере.
Так же отмечу, что можно использовать все, не только текст, но и цифры и символы {1|2}, {$|₽}
Результат генерации текста в рандомизаторе
Рандомизиторовать можно не только описания, но и заголовки объявлений
Пример использования рандомизации заголовков для массовой публикации объявлений. Случайный профиль
Заключение
Рандомизация — это мощный инструмент любого товарного (и не только) бизнеса, которым не стоит пренебрегать.
В этой статье я лишь ограничивался Авито, но не стоит забывать, что есть еще Озон, Вайлдберрис, Яндекс Маркет и другие площадки с сотнями селлеров, которые точно используют рандомизацию текста между своими товарами.
Можно ссылку на рандомизатор?
Да, если вам понравилось, или столкнулись с проблемами, опишите свой опыт в комментариях, буду рад помочь или просто почитать. 😀
Недавно я разработал и запустил сервис автоматической публикации объявлений на Авито. Сервис позволяет бизнесу максимально эффективно использовать рекламный потенциал, полностью автоматизируя процесс публикации и управления объявлениями.
Предпросмотр объявления в интерфейсе сервиса
Сервис предлагает удобный интерфейс для создания и настройки объявлений, а также возможность задать параметры публикации, такие как географическое расположение, категория товара, цена и т.д. Сервис обеспечивает автоматическую публикацию и редактирование объявлений в указанных категориях, регионах и заданном интервале публикаций, что позволяет бизнесу значительно сократить время на поддержку объявлений в актуальном состоянии.
Основными фишками сервиса являются:
Быстрая и простая настройка объявлений
Поддержка шаблонизации любых текстовых полей
Пример: {Собственное|Локальное} производство мебели – в объявлении будет использовано одно из слов (”Собственное” либо “Локальное”)
Пример 2: случайная стоимость в объявлении {130000|120000|125000|135000|137500} (см. пример на фото)
Автоматическая публикация в выбранных категориях и регионах
Возможность устанавливать периодичность и время публикации
Поддержка работы с несколькими аккаунтами Авито из единого интерфейса
Я рад, что сервис стал незаменимым инструментом для многих бизнесов, позволяя им максимально эффективно использовать потенциал Авито и увеличивать продажи своих товаров и услуг в десятки раз!
Ниже прикладываю скриншоты сервиса с небольшим описанием
Добавление аккаунта Авито в систему.
Можно добавить неограниченное количество аккаунтов и управлять объявлениями по всем аккаунтам в едином интерфейсе (с возможностью фильтрации)
Импортирование файла объявлений Авито
Если до этого аккаунтом использовался функционал "автозагрузки Авито", файл с объявлениями можно импортировать и все объявления появятся в сервисе
Автозаполнение
Если заполнить эти поля, они будут автоматически заполняться для всех создаваемых объявлений
Страница объявлений
Фильтрация и возможность скрыть / показать дополнительные поля
Предпросмотр объявления из интерфейса сервиса (как оно будет выглядеть на Авито)
Описание объявления с возможностью использовать формулы для шаблонизации
Настройки объявления
Настройка сроков размещения, для удобства можно выбрать временную зону города
На текущий момент сервис находится на закрытом тестировании.
Спасибо, что дочитали :)
* Вас интересует разработка сложного сайта, веб-сервиса или онлайн-платформы?
Напишите мне в Telegram «консультация» и я бесплатно проконсультирую Вас по реализации Вашей идеи «под ключ». ⤵️