• Как объединить регулярные выражения?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Делайте в 2 этапа:
    1. Размечайте токены (сочетания букв и одиночные буквы из начального слова) и указывайте нужное действие для замены каждому токену (что на что менять).
    2. Производите замену каждого токена (и в самом конце: конкатенацию, для получения полного слова).

    или

    Соблюдайте правильный порядок внутри массива замены: сначала - 3 буквы, затем - 2, затем - оставшиеся одиночные.
    Ответ написан
  • Есть решения по проверке орфографии?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Используйте regex и проверяйте на невалидные цепочки слов и знаков препинания внутри текста перед постингом и нормализуйте токены-разделители.
    2. Проверяйте сами слова на валидные символы (и их цепочки), на ограничение длины и на содержание в стоп-листе.
    источник
    <?php
    $values = array(
        'text???',
        '???text',
        'text???text',
        'text ? ? ? ? ? text'
    );
    
    foreach ($values as $original_value) {
        $value = preg_replace('/([?!.:,;]|\s)\1+/', '$1 ', $original_value);
        echo $original_value . "\n" . $value . "\n\n";
    }
    Результат
    text???
    text? 
    
    ???text
    ? text
    
    text???text
    text? text
    
    text ? ? ? ? ? text
    text ? text

    Вот либа для русского языка: Typograph
    На данный момент типограф умеет...
    Обрабатывать тексты в различных кодировках(требуется iconv).
    Заменять кавычки на ёлочки.
    Склеивать двойные кавычки.
    Заменять знак дефиса или два знака дефиса подряд — на знак длинного тире.
    Заменять знак дефиса, ограниченный с обоих сторон цифрами — на знак короткого тире.
    Заменять множество пробелов или табуляций на один пробел.
    Заменять х в выражениях вроде 10x10 на знак умножения.
    Исправлять неправильную расстановку запятых.
    Разносить неправильно расставленные кавычки.
    Вставлять неразрывный пробел после инициалов, сцеплять инициалы.
    Делать неразрывными названия организаций и аббревиатуры форм собственности.
    Делать неразрывными имя собственное и относящееся к нему сокращение.
    Не разделять 2007 г., ставить пробел, если его нет.
    Сцеплять скобки со словами.
    Заменять 1/2 1/4 3/4 на спецсимволы.
    Следить за тем, чтобы предлоги и союзы не находились в конце строки.
    Следить за тем, чтобы частицы бы, ли, же и т.д. не отрывались от предшествующего слова.
    Форматировать русские денежные суммы, расставляя пробелы в нужных местах.
    Заменять от 3-х до 5-и точек подряд на троеточие.
    Притягивать к слову запятые, отделять пробелом от последующего слова.
    Притягивать к слову восклицательный знак.
    Делать замену для +-.
    Обрабатывать вложенные кавычки.
    Притягивание чисел к знаку умножения.
    Запятые до «а» и «но».
    Притягивание «;» к предшествующему слову.
    Убирает лишние знаки: «??» в «?», «!!!!» в «!!!».
    Правильные апострофы в «LO'Лайт».
    Прямая речь.
    Неразрывные IP-адреса.

    Добавлю ещё, что если есть ограничение на количество символов в объявлении - то сразу лучше ограничить количество слов (2 буквы и более) не несущих смысл (союзы, предлоги и т.д.). Тогда текст объявлений будет намного качественнее для ЛЮДЕЙ (и для поисковиков, конечно)!

    Что такое заспамленность в целом (понятия: водность, тошнота текста и др.): тут
    Онлайн анализ текста: здесь

    Т.е. это должно работать сразу, до принятия объявления системой (т.е., обычно, до его публикации).
    Ответ написан
    5 комментариев
  • Как реализовать такую карту?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    См. оф. документацию виджета Я.Карт.
    Ответ написан
    Комментировать
  • В чем можно создать шаблон для статьи?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Ответ написан
    Комментировать
  • Как получить доступ к содержимому DOM, подгружаемому через Ajax на сайте vk.com?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    MutationObserver
    var targetNode = document.querySelector("#someElement");
    var observerOptions = {
      childList: true,
      attributes: true,
      subtree: true //Omit or set to false to observe only changes to the parent node.
    }
    
    var observer = new MutationObserver(callback);
    observer.observe(targetNode, observerOptions);

    UPD: здесь с проверкой работы старым и новым способом.
    Ответ написан
  • Чем плохо написание кода функциями?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Проблема масштабируемости и расширяемости кода приложения.
    Пока у Вас один тип объектов - можно всё писать и функциями (и хранить всё в массиве).
    Но потом - придётся всё переписывать на классы и т.д.
    Ответ написан
    Комментировать
  • Как веб-разработчику взаимодействовать с заказчиком?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Всё обговариваете заранее ДО начала работ!
    2. Хостинг - может выбрать как Заказчик, так и Вы - это по договорённости.
    3. Если Вы занимаетесь размещением сайта на хостинге (и его настройкой) - это тоже работа (хотя и небольшая при небольших рядовых проектах) и она должна быть оплачена (стоимость хостинга - сюда НЕ ВХОДИТ!).
    4. Регистрируйте хостинг на данные заказчика и просите его оплатить (или просите перечислить ту же сумму и оплачиваете сами).

    Самое неразумное, что можно сделать:
    или могу просто поставить его перед фактом?
    Никогда так не делайте! Всегда советуйтесь, объясняйте и давайте аргументацию по тому, почему Вы посоветовали именно этот хостинг. Всегда давайте выбор Заказчику.
    Ответ написан
    Комментировать
  • Фреймворк для асинхроного UI на js?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. includeHTML
    2. REX Tiny templater
    Ответ написан
    Комментировать
  • Есть множество одинаковых элементов с js-фичей выполняющей одно и тоже действие, как заставить работать js для каждого такого элемента отдельно?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    <div class="cartButton" onclick="toCart(this,'12345')">В корзину</div>

    <div class="cartButton" onclick="toCart(this)" data-id="12345">В корзину</div>

    Или создав event-listener динамически: как именно - написано здесь.

    И по this - мы получаем идентификатор объекта, на который бы клик.
    Затем навигируемся по DOM-ветке и берём нужные параметры (или берём из этого любой тег, включая коллекцию dataset).
    Ответ написан
    Комментировать
  • Как сделать автообновление значений на html странице с embedded сервера?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    JS, websocket, SPA и API со стороны роутера для подключения к веб-сокету для получения значений в real-time режиме.
    Ответ написан
    Комментировать
  • Чем тестировать небольшое SPA?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    маленькое SPA на чистом JS
    можно протестить вручную на 2-3х устройствах, исходя из bottleneck:
    1. Поддержка браузерами нужных функций: https://caniuse.com/
    2. Проверка на внезапные разрывы соединений (Fiddler debugger) и восстановление работы после сбоя приложения.
    3. Корректная обработка всех тач-событий (UI).

    Это можно сделать как самому, так и заказав подобную работу на фрилансе.
    Ответ написан
    Комментировать
  • Какие технологии помогут сделать безопасный канал передачи данных?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Банально:
    Добавляйте подпись к запросу с временем и случайным набором символов.
    На стороне устройства - запрещайте повторные запросы лет на 10.
    Итог: даже зная что Вы отправили, нельзя это никак использовать.

    Хотите зашифровать само "тело" запроса (чтобы не читали) - шифруйте любым способом (главное при этом - не используйте TOKEN сеанса для шифрования!).
    Здесь подробно.
    Ответ написан
    Комментировать
  • Как находить эллипсы на изображении?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Нужно искать не эллипсы, а хордовые сектора - "дольки" (апельсина, например).
    1. После того, как найден такой сектор (не менее 1/3 площади круга): нужно определить центр и залить до границ, не выходящих за круг, образованный этим сектором при вращении вокруг центра круга (с радиусом этого сектора).
    2. После нахождения - вырезаем торец бревна и снова ищем сектор.
    Сколько таких будет - столько и брёвен на фото.

    "Дольку" найти просто - находим светлую зону и сверяем геометрию границ (ищем дугу) с заданной точностью. По дуге - находим радиус.

    PS: Если усложнить, то по контуру найденной дуги нужно восстановить контур эллипса, которому она принадлежит.
    Ответ написан
    Комментировать
  • Есть ли сервисы для генерации регулярных выражений?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Создаём "ядра" - уникальные ПОСЛЕДОВАТЕЛЬНЫЕ! сочетания символов каждой строки (относительно других) и запоминаем к какой фразе каждое ядро относится (номер строки - это ID ядра).
    2. Записываем через "или" в регулярку: /(^core1$)|(^core2$)|(^...$)/usi
    3. При совпадении ядра - мы точно знаем, что фраза есть в списке и ТОЛЬКО! 2-ым этапом проверяем фразу полностью (фразу находим, соответственно, по ID-ядра).

    PS: Это имеет смысл делать, если фраз больше 10-ти (или общая длина символов всех строк превышает 100-150).
    Ответ написан
    Комментировать
  • Как защитить html?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Придётся сделать канвас-прослойку и рендерить HTML на сервере, а отображать - в канвасе.
    Редактирование - придётся всё запрослоить... (А что делать?!)
    Ответ написан
    Комментировать
  • CMS или вообще конструктор?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    includeHTML (+fetch()) + REST API (PHP) = SPA
    И всё, что относится к корзине - передавать/получать через JSON .
    Описание includeHTML
    includeHTML - решение всех проблем в плане SPA и предотвращение полной перезагрузки страницы при обновлении одного/нескольких блоков!

    Основные преимущества:
    0. Всего ОДНА ФУНКЦИЯ!
    1. Вставка любой HTML-разметки через HTML-тег или через JS-функцию.
    2. Асинхронная и синхронная загрузка (по желанию).
    3. Рекурсивная загрузка всех вложенных зависимых блоков.
    4. Создание своей функции-обработчика после окончания загрузки нужного блока.
    5. Возможность любой компоновки блоков (включая бесконечную вложенность одних в другие!) на одной странице.
    6. Возможность многократного повторного использования блока(-ов) на разных страницах.
    7. Возможность создания своих представлений интерфейса (layouts) в зависимости от целей конкретного пункта в главном (или второстепенном) меню раздела/категории/страницы.

    Итог:
    Полученное быстродействие - будет максимальным!
    Ответ написан
    2 комментария
  • Смысл хранить «секреты» приложений через переменные окружения?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    YOURAPPLICATION_SETTINGS
    Читаем здесь и понимаем, что файл замены переменных окружения может находиться по произвольному пути.
    Т.е. это сделанно именно для тех целей, чтобы случайно не выгрузить секреты на гит или не дать злоумышленнику получить к нему доступ из приложения (т.к. он находится ВНЕ приложения и доступ должен быть настроен верно!).
    Также, сразу после установки переменных окружения, можно принудительно (дополнительно) сменить доступ/демонтировать источник с файлом замены переменных окружения.

    Также, посмотрите на той же странице лучшие практики конфигурирования: здесь
    Ответ написан
    Комментировать
  • Как реализовать синтез речи?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Лучше сразу делать качественно с нейронными сетями.
    Изучайте Python и НС.
    Применяйте нужные библиотеки и пишите код.

    Пакет от NVIDIA: OpenSeq2Seq
    machine translation (GNMT, Transformer, ConvS2S, …)
    speech recognition (DeepSpeech2, Wave2Letter, Jasper, …)
    speech commands (RN-50, Jasper)
    speech synthesis (Tacotron2, WaveNet…)
    language model (LSTM, …)
    sentiment analysis (SST, IMDB, …)
    image classification (ResNet-50)

    Озвучка (TTS) : Tacotron 2

    Лекции:
    Лекции 1
    Лекции 2

    PS:
    Синтез и перевод - разные вещи.
    Синтез - это текст в звук.
    А перевод - это с одного разговорного языка на другой.
    Ответ написан