• Как протестировать на нагрузку бота использующего longpool?

    @matperez
    1. Напишите свой сервер longpoll и шлите с него запросы.
    2. Можно выдернуть из приложения механизм обработки событий и протестировать его отдельно от longpoll. Верхнюю границу получите, возможно, этого будет достаточно.
    Ответ написан
  • Как перекодировать видео с понижением fps?

    @matperez
    Попробуйте FFMPEG

    ffmpeg -i <input> -filter:v fps=fps=30 <output>
    Ответ написан
    Комментировать
  • Не работает OpenVPN-клиент на Zyxel Keenetic Ultra 2, что делать?

    @matperez
    Каким образом задаете конфиг? Если просто текстом, то вставьте сертификат прямо туда

    Вместо
    ca BODO:\knd.crt
    должно быть
    <cert>
    тут содержимое knd.crt
    </cert>
    Ответ написан
  • Yii2 тестирование urlRule?

    @matperez
    Сделайте $request->setUrl(<ссылка на которой нужно проверить правило>) перед выполнением $rule->parseRequest()

    И читайте исходники, там все написано \yii\web\Request:858
    Ответ написан
    Комментировать
  • Как выполнить поиск по дате в Elasticsearch?

    @matperez Автор вопроса
    Отвечу себе сам

    1. Условия И и ИЛИ заменяются ключевыми словами MUST и SHOULD соответственно.

    2. Конкретно на NULL проверить значение нельзя. Поля с таким значением считаются отсутствующими, так что проверять нужно существование поля через ключевое слово EXISTS, а не его значение. Так же нельзя сделать условие "поле отсутствует", но можно обернуть "поле присутствует" в "и не" через MUST_NOT.

    Либо можно через маппинг задать значение по умолчанию, которое будет подставляться автоматом, если в поле было значение NULL и его потом искать.

    Итого получается такой запрос:
    {
    	"query": {
    		"bool": {
    			"should": [
    				{
    					"bool": {
    						"must_not": {
    							"exists" : { "field" : "active_from" }
    						}
    					}
    				},
    				{
    					"range": {
    						"active_from": {
    							"lte": "2017-10-24",
    							"format": "yyyy-MM-dd"
    						}
    					}
    				}
    			]
    		}
    	}
    }


    Это все применимо к 5.6
    Ответ написан
    Комментировать
  • PHP-парсинг данных с HTML-страницы. Как реализовать с SimpleHTMLDOM или аналогом?

    @matperez
    Вы что-то пробовали уже? В принципе примера со страницы проекта должно быть достаточно
    // Дергаете страницу
    $html = file_get_html('http://slashdot.org/');
    
    // Находите информацию по селектору CSS
    foreach($html->find('div.article') as $article) {
        // парсите результат и закидываете в массив
        $item['title']     = $article->find('div.title', 0)->plaintext;
        $item['intro']    = $article->find('div.intro', 0)->plaintext;
        $item['details'] = $article->find('div.details', 0)->plaintext;
        $articles[] = $item;
    }
    
    print_r($articles);


    find('селектор') вернет все найденные элементы попадающие под селектор в виде массива. это подходит для элементов типа changelists -> changelist.
    find('селектор', 0) вернет первый попавшийся элемент - его нужно использовать, если знаете что он один. это подходит для элементов типа changelist -> version или changelist -> infofmation.
    Ответ написан
    Комментировать
  • Как реализовать поиск по разделам сайта на yii2?

    @matperez
    Вам нужно какое-то отдельное хранилище (таблица в БД), в котором будут лежать такие данные:
    1. тип сущности (по сути имя соответствующей таблицы или модели)
    2. id сущности
    3. текст по которому будет выполняться поиск

    Поля тип и id сущности нужны чтобы связать найденные элементы с реальными страницами вашего сайта.

    В качестве такого места для поиска может выступать как отдельная табличка в БД, так и отдельная база данных типа Elasticsearch.

    Вам нужно будет 1 раз наполнить эту таблицу разово и потом обновлять ее каждый раз, при изменении данных по которым нужно выполнять поиск.
    Ответ написан
  • Для чего нужен в Yii2 фильтр ContentNegotiator?

    @matperez
    Ну да, вы сами себе ответили.
    Посмотрите код. Там, в принципе, видно, что язык и формат ответа можно передавать как через заголовки, так и через GET параметры _lang и _format.
    Ответ написан
    Комментировать
  • Переопределить метод find через функцию в Модели?

    @matperez
    Вам нужно создать свой класс. Какой-нибудь ItemQuery. Наследовать его от yii\easyii\components\ActiveQuery и добавить туда трейт MultilingualTrait и его уже возвращать из Item::find(). И будет вам счатье.
    Ответ написан
    7 комментариев
  • Каким образом реализуются админки в микросервисной архитектуре?

    @matperez Автор вопроса
    Сам себе отвечу:

    1. Бегать по микросервисам и собирать из них данные через их API для вывода в админке.
    + строгая согласованность
    - медленно

    2. Завести отдельную базу (Базу), в корой в денормализованном виде хранить все нужные данные вместе. Обновлять данные в Базе при изменениях в микросервисах. Админку строить на основе этой Базы.
    + быстро
    - итоговая согласованность (не факт что в момент запроса ситуация будет именно такой как она представлена в единой базе)

    3. Смешать оба способа. Что-то получать из базы общей, за чем-то ходить напрямую к сервисам.
    Ответ написан
    Комментировать
  • Как развернуть(деплой) YII2 в продакшен на VPS хостинге?

    @matperez
    Зря вы так с ними. Папки tests и runtime вам никакой нагрузки не дают. Размер tests по сравнению с остальными частями системы обычно ничтожен, а само ее наличие никакой нагрузки на сервер не создает (вообще никакой). Без папки runtime вы не сможете запустить проект, это папка для временных файлов, которые возникают во время работы.

    Разворачивать проект можно руками, самописными скриптом или с помощью готовых инструментов типа Сapistrano.

    При деплое лучше убедитесь что, при установке пакетов, Composer запускается с ключами --no-dev (не устанавливать зависимости, требуемые для разработки) и -o (оптимизировать автозагрузчик) - вот это действительно даст выигрыш и по нагрузке на систему и по занимаемому месту.
    Ответ написан
    5 комментариев
  • Как переписать этот SQL запрос на Query Builder?

    @matperez
    Посмотрите в доку. Там на большую часть ваших вопросов есть ответы. Вот, например про вложенные селекты:
    $subQuery = (new Query())->select('COUNT(*)')->from('user');
    
    // SELECT `id`, (SELECT COUNT(*) FROM `user`) AS `count` FROM `post`
    $query = (new Query())->select(['id', 'count' => $subQuery])->from('post');


    Если вам модели не требуются, можно использовать просто DAO
    $sql = "SELECT
        iu.*, u.banned, u.foto,
        (SELECT SUM(rating)/COUNT(*)
            FROM `olit_insurance_reviews`
            WHERE company_id = u.user_id and rating > :rating AND parent_id IS NULL) as rating,
        (SELECT COUNT(*)
            FROM `olit_insurance_reviews`
            WHERE company_id = u.user_id AND parent_id IS NULL) as reviews_count
        FROM `olit_insurance_users` as iu
        INNER JOIN `olit_users` as u
        ON u.user_id = iu.user_id
        WHERE u.user_group = :userGroup ORDER BY u.banned DESC, iu.company_name ASC";
    $cmd = Yii::$app->db->createCommand($sql, [':userGroup' => 6, ':rating' => 0]);
    $items = $cmd->queryAll();
    Ответ написан
    Комментировать
  • Как асинхронно загрузить данные в модальное окно?

    @matperez
    При нажатии на кнопку открытия окна сначала идите на сервер за данными, потом заменяйте полученным с сервера текстом содержимое модального окна и только после этого показывайте его.

    Ссылку может сразу передать в свойства кнопки через data-атрибут. Например так:
    Html::button($comp->name, ['data-url' => Url::to(['view', 'id' => $comp->id]), 'rel' => 'toggle-modal'])


    Потом через js ловите клик по селектору '[rel=toggle-modal]', выдергиваете ссылку через $(this).data('url') и дальше по плану.

    Как отловить клик, сделать get запрос на сервер, найти модальное окно по id и вызвать его отображение программно уж загуглите сами.
    Ответ написан
  • Asus K551ln можно ли поставить Ful HD матрицу IPS?

    @matperez
    Скорее всего Full HD поставить можно, в спецификации присутствует https://www.asus.com/Laptops/K551LN/specifications/

    На выбор есть три

    www.zandparts.com/en/Asus-18010-15601500
    www.zandparts.com/en/Asus-18010-15611900
    www.zandparts.com/en/Asus-90NB05F0-R20010

    В чем разница и действительно ли они подойдут разбирайтесь сами.
    Ответ написан
    Комментировать
  • Как использовать две формы с одной кнопкой?

    @matperez
    Прям подробно не подскажу, но общий порядок действий может быть такой:
    На первой вкладке перехватить сабмит и переключиться на вторую вкладку. Как сабмит перехватить можете почитать тут https://yii2-cookbook.readthedocs.io/forms-activef... Как переключиться в js на вторую вкладку загуглите сами.
    На второй вкладке можно этот фокус повторить и по итогу уже данные обеих форм отправить через ajax запрос на бекенд.

    Тут правильным вопросом будет не как это в принципе провернуть, а где хранить состояние между шагами формы (как на следующем шаге получить данные предыдущего). Можете хранить его на бекенде в сессии, можете хранить в GET-параметрах, можете прямо в html (как указано выше), а можете в каком-нибудь отдельном js объекте. Решите как вам удобнее и потом уже понятно будет как именно это реализовать.
    Ответ написан
    Комментировать
  • CQRS и ограничение доступа?

    @matperez
    Права доступа к CQRS вообще не имеют отношения. Это как бы теплое и мягкое. Где-то на уровне приложения у вас должна быть служба ответственная за раздачу прав доступа. Если пользователь хочет выполнить какую-либо команду или запрос нужно сначала сходить к этой службе, узнать может ли он это сделать и только потом отправить агрегату команду или выполнить запрос, вот и все.

    Ограничивать доступ на уровне отдельного поля мне не кажется хорошей идеей. Правильнее, либо выделить данные о владельце в отдельную сущность и уже к ней ограничивать доступ, либо ввести разные типы запроса: "с данными владельца" и "без данных о владельце" и ограничивать возможность совершать конкретные запросы.
    Ответ написан
    Комментировать
  • Как правильно использовать CASE WHEN в ActiveRecord в YII2?

    @matperez
    Добавьте публичное поле region_in_range в модель, после этого ORM будет заполнять его данными, а вы сможете к нему обратиться.
    Ответ написан
    1 комментарий
  • Как в matchCallback передать используемую модель?

    @matperez
    Мне кажется, вам уже можно использовать RBAC

    И еще один момент. Ваша задача там решается так
    [
        'allow' => true,
        'actions' => ['update'],
        'roles' => ['updatePost'],
        'roleParams' => function() {
            return ['post' => Post::findOne(Yii::$app->request->get('id'))];
        },
    ],


    или так

    [
        'allow' => true,
        'actions' => ['update'],
        'roles' => ['updatePost'],
        'roleParams' => ['postId' => Yii::$app->request->get('id')];
    ],


    Если абстрагироваться от RBAC, то следуя этой логике вы должны самостоятельно найти модель в БД в matchCallback и там уже выполнить все необходимые проверки.
    Ответ написан