Задать вопрос
  • Какой интегратор выбрать при написании CRM для instagram, whatsapp, telegram, vk?

    @paldraken
    Похоже первым шагом нужно разобраться с ТЗ.
    Возможны разные варианты
    * Тянуть к себе в базу все сообщения и как то их использовать потом в карточке клиента, тут отдельно подумать, о том что завязываться на вендора (конкретного агрегатора) или делать универсальное решение.
    * Просто в карточке клиента отображать чат, есть агрегаторы которые дают настраиваемый iframe с чатами.
    * Возможно, вообще менеджеры будет пользоваться интерфейсом агрегатора, а в CRM только будут попадать только уведомления.

    Про WhatsApp стоит знать что есть официальный WhatsApp бизнес, но стоит он не дешево. А есть сервисы предлагающие решения на основе web версии и стоит это сильно дешевле но с ограничениями (например рассылки чреваты баном).
    И если клиенты компании которая будет использовать CRM, находятся в России то вероятно вам нужен будет именно WhatsApp и во вторую очередь Инста. Остальные мессенджеры непопулярны.
    Ответ написан
  • Оптимизация большой таблицы mysql, правильно ли?

    @paldraken
    Используйте партиционирование (partitioning).
    Это как раз и есть способ разбиения разбиения большой таблицы на логические части по определенным критериям. В вашем случае это будет поле дата. Например:
    CREATE TABLE employees (
        id INT NOT NULL,
        fname VARCHAR(30),
        lname VARCHAR(30),
        hired DATE NOT NULL DEFAULT '1970-01-01',
        separated DATE NOT NULL DEFAULT '9999-12-31',
        job_code INT,
        store_id INT
    )
    PARTITION BY RANGE ( YEAR(separated) ) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1996),
        PARTITION p2 VALUES LESS THAN (2001),
        PARTITION p3 VALUES LESS THAN MAXVALUE
    );

    Пример отсюда
    Впрочем миллион строк это действительно немного и возможно стоить начать с индексов
    Ответ написан
    Комментировать
  • Как вести документацию по серверам (Сис.Администрирование)?

    @paldraken
    Для паролей и другой секурной информации использую enpass
    База паролей шифруется и закрыта мастер паролем. Внутри удобная древовидная структура. Для синхронизации между командой можно использовать облачные хранилища. Бесплатна для декстопов.
    Как альтернатива опенсорсный KeePass, но с ним пришлось повозится чтобы настроить синхронизацию под линукс.
    Ответ написан
    1 комментарий
  • Как перенести params.php в модуль?

    @paldraken
    В документации по модулям как раз нужный вам пример
    www.yiiframework.com/doc-2.0/guide-structure-modul...
    namespace app\modules\forum;
    
    class Module extends \yii\base\Module
    {
        public function init()
        {
            parent::init();
            // initialize the module with the configuration loaded from config.php
            \Yii::configure($this, require(__DIR__ . '/config.php'));
        }
    }

    config.php
    <?php
    return [
        'components' => [
            // list of component configurations
        ],
        'params' => [
            // list of parameters
        ],
    ];
    Ответ написан
  • Как с помощью sequelize получить запрос такого вида?

    @paldraken
    Попробуйте такую конструкцию.
    db.User.findAll({
        attributes: Object.keys(db.User.attributes).concat([
            [db.sequelize.literal('(SELECT count(*) FROM user_phones WHERE user_phones.user_id = user.id)'), 'total']
        ])
    })
    Ответ написан
  • Как должен выглядеть процесс работы с Docker?

    @paldraken
    Попробую описать простыми словами без серьезной терминологии (Devops'ы не бейте ногами).

    Следующим шагом я бы рекомендовал вам начать использовать docker-compose.
    Он позволит всю инфраструктуру описать в одном конфигурационном файле, запускать все одной командой и создать алиасы для общения контейнеров между собой.

    Например у нас такая структура. Я использую php но для nodejs может быть похоже.
    project
       - scr/   #Код проета под контролем версий в git
            - Dockerfile
            - phpfile1.php
            - phpfile2.php
            - etc.php
       - db_data/ #папка где будут сохранятся база данных. (иначе каждый запуск контейнера будет ее обнулять)
       - docker-compose.yml
       - site.conf   #конфиг для виртуального хоста nginx
       - nginx.conf #конфиг nginx


    Настраивается взаимодействие в специальном файле.
    docker-compose.yml
    version: '2'
    services:
      nginx:
        image: nginx:latest
        ports:
          - "8080:80"
        volumes:
          - ../src/:/app
          - ./site.conf:/etc/nginx/conf.d/site.conf
          - ./nginx.conf:/etc/nginx/nginx.conf
        links:
          - php
      db:
        image: mysql:5.7
        volumes:
          - ./db_data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: 123
          MYSQL_DATABASE: changeme
          MYSQL_USER: changeme
          MYSQL_PASSWORD: 123
        ports:
          - "33306:3306"
      php:
        build: ../src
        volumes:
          - ../src:/app
        depends_on:
          - db
        environment:
          PHP_DB_HOST: db:3306
          PHP_DB_USER: changeme
          PHP_DB_PASSWORD: 123


    Тут я использую контейнер nginx и mysql из DockerHub и свой контейнер для php описанный в
    src/Dockerfile
    FROM php:fpm
    
    RUN apt-get update && \
      apt-get install -y \
        openssl \
        git \
        curl \
        unzip
    
    RUN docker-php-ext-install pdo pdo_mysql
    
    ADD . /app
    WORKDIR /app


    Теперь использовав docker-compose up мы удобно запустим все контейнеры с нужной конфигурацией.
    Взаимодействие между контейнерами будет происходить по алиасам
    например из php соединение с БД происходит так:

    db.php
    return [
        'class' => 'yii\db\Connection',
        'dsn' => "mysql:host=db:3306;dbname=donor", // db:3306 - это services имя контейнера с mysql в docker-compose.yml 
        'username' => getenv('PHP_DB_USER'), // это переменные окружения для контейнера тоже из docker-compose.yml
        'password' => getenv('PHP_DB_PASSWORD'),
        'charset' => 'utf8',
    ];



    Код прокидываем в 2 контейнера php и nginx (раздел volumes). То есть внутри контейнера создается директория /app которая ссылается на директорию на хост машине. Для разработки очень удобно, вы изменяете код и сразу можно обновлять страницу.

    На продакшен я обновляю код через git из репозитория и перезапускаю контейнеры (если надо).

    ps. Это один из самых простых способов, разумеется существуют более "взрослые" и "правильные" методы. Но надеюсь мое описание позволит вам сдвинутся с мертвой точки в изучении докера.
    Ответ написан
  • Как в YII2 сделать выполнение определенного действия во всех контроллерах?

    @paldraken
    Сделать некий базовый контроллер у которого переопределить метод
    beforeAction
    В этом методе реализовать вашу логику по считыванию информации.
    А затем те контроллеры в которых надо применять эту логику унаследовать от Базового.

    class BaseController extends \yii\web\Controller
    {
        public function beforeAction($action)
        {
            if (!parent::beforeAction($action)) {
                return false;
            }
            // Тут прописать логику или вызвать отслеживающий сервис
            return true;
        }
    }
    
    class MyController extends BaseController
    {
        public function actionIndex()
        {
    .....
    Ответ написан
    2 комментария
  • Как поделиться картинкой в instagram?

    @paldraken
    Напрямую нельзя, но можно, при условии установленного приложения инстаграм использовать intent
    https://www.instagram.com/developer/mobile-sharing...
    Ответ написан
    Комментировать
  • Как сделать категории для элементов recyclerview, которые подгружаются из сети?

    @paldraken
    Стоит относится к кешу как к короткоживущим данным. Задача которого избежать повторных запросов к сети при пересоздании активити (например при повороте экрана) . А при смене фильтров или категорий стоит инвалидировать кеш и получать данные снова.
    Ответ написан
    Комментировать