Задать вопрос
  • Какой почтовый сервер лучше для оборудования?

    Vamp
    @Vamp
    Это только MTA. Нужен ещё IMAP сервер, спам-фильтр, антивирус, DKIM/ARC milter, веб админка, веб морда.
  • Как в одном контейнере (php) вызвать другой?

    Vamp
    @Vamp
    Roman Biz, с библиотекой всё так. Не так здесь про проброс docker сокета в контейнер. По уровню безопасности это как запускать скрипты от имени root прям на хосте.
  • Возможен ли перехват tcp tls траффика в незашифрованном виде напрямую с устройства?

    Vamp
    @Vamp
    Валентин, полагаю, автор вопроса не имеет контроля над приложением, но очень хочет отреверсить его протокол. Был бы доступ к нешифрованному участку (к серверу, по сути), то и вопроса бы не возникло.
  • При инициализации класса, загружаются ли в память его instace-члены?

    Vamp
    @Vamp
    3.1, 3.2. Берётся из оперативной памяти. Не бывает такого, что загрузилась только часть класса, а потом по мере надобности догружаются оставшиеся части класса. Класс либо загружается в память полностью и создаётся объект класса Class для него, либо не загружается вообще с генерированием соответствующего исключения - ClassNotFoundException, NoClassDefFoundError, VerifyError, LinkageError и др. Создавать объекты и вызывать методы (статические и нестатические) можно только на полностью загруженном классе.
  • Тип данных с плавающей точкой в php?

    Vamp
    @Vamp
    Я прекрасно понял вашу задачу. Для неё как раз идеально подходит bcadd.
    $a = [
      '123456789012345.02',
      '8888.88',
      '987654321.01',
      '123',
      '8585898',
    ];
    $sum = '0';
    foreach ($a as $b) {
      $sum = bcadd($sum, $b, 2);
      echo $b.'<br>';
    }
    echo 'total: '.$sum;

    Bcmath особенно полезен, если вам нужен точный результат.
  • Тип данных с плавающей точкой в php?

    Vamp
    @Vamp
    Вот здесь и пригодится ранее упомянутый bcmath:

    $a = '123456789012345.02';
    echo bcadd($a, '836257284.03', 2);
  • Как пользоваться gRPC?

    Vamp
    @Vamp
    Через composer его не установить. Это отдельная независимая программа, которая нужна только один раз для первичной генерации grpc клиента. В следующий раз она понадобится только когда сервер внесёт изменения в свой proto файл - тогда и нужно будет перекомпилировать скрипты grpc клиента. Да и то не факт, так как protobuf создавался с расчетом на обратную совместимость и если новые фичи из нового proto файла не нужны, то и компилировать заново ничего не нужно. Ещё перекомпиляция потребуется при переходе на новую версию grpc/protobuf модуля.

    Скачать компилятор с плагином можно с официального сайта. В конце страницы есть таблица со ссылками на результаты ежедневных билдов. Переходите по самой свежей ссылке из колонки "Build ID" и качайте архив под свою систему из раздела "gRPC protoc Plugins". В архиве будет и плагин, и сам компилятор.
  • Как протестировать защищенный метод абстрактного класса?

    Vamp
    @Vamp
    Как раз наоборот - protected члены являются частью публичного интерфейса. Проставляя этот модификатор автор класса даёт чётко понять, что метод предназначен для переопределения/вызова из дочернего класса. Вы не можете просто так взять и удалить protected метод из класса или кардинально поменять его сигнатуру, так как вы не знаете сколько пользовательского кода может быть завязано на него. Подобные действия требуют увеличения мажорной версии проекта (если применяется semver), прямо как с публичными методами. Вот private члены да, не являются участниками публичного интерфейса. Их область действия очень чётко ограничена и поэтому можно делать с ними что угодно, не боясь кого-нибудь сломать.

    Я не вижу ничего зазорного в том, чтобы протестировать protected метод. Правда, я бы сделал полноценного наследника вместо рефлексии.
  • Какие библиотеки посоветуете для создания приложения для каршеринга?

    Vamp
    @Vamp
    С такими излишне оптимистическими исходными данными никакой бизнес долго не продержится :)
  • Как правильно подключить сертификат безопасности (SSL) к HikariCP Mysql подключению к базе на Java?

    Vamp
    @Vamp
    Не получается подключить использование SSL сертификата - расширение .pem

    А как пробовали? Покажите код.

    Попробуйте выполнить инструкции, описанные в официальной документации.
  • Какие библиотеки посоветуете для создания приложения для каршеринга?

    Vamp
    @Vamp
    Так себе вариант. Злодеи залепят код и тем самым выведут машину из оборота.
  • Разные development и production окружения не нарушают концепцию Docker?

    Vamp
    @Vamp
    Хорошего примера не знаю. Самому пришлось собирать информацию по крупинкам из многочисленных экспериментов и чужих докерфайлов. Чуть позже обновлю решение своим примером.
  • Какой путь прописать для upload_tmp_dir?

    Vamp
    @Vamp
    к примеру для папки /var/www/mysite/ - владелец - пользователь nginx (полный доступ) и группа mysite (только чтение), а остальным все запрещено

    Ну нет же, не nginx. Зачем nginx'у полный доступ? При обнаружении уязвимости в nginx, такие права позволят взломать сайт. Сделайте себя владельцем всех папок и файлов сайта. Тогда вы сможете обновлять сайт без лишних проблем, а nginx и php нет, так как получают права группы, у которой права на запись есть только в специальные папки (сессии, tmp и т.п). Nginx получает доступ на чтение, так как состоит одновременно в группах mysite и example.

    Разграничение доступа группами работает только при использовании нескольких php-fpm пулов. Насколько я понял, вы не собираетесь делать отдельный пул для каждого сайта, поэтому заморочки с пользователями и группами не нужны.
  • Какой путь прописать для upload_tmp_dir?

    Vamp
    @Vamp
    Если разграничивать доступ группами, то без вариантов необходимо использовать отдельный пул для каждого сайта. Если же не хочется плодить пулы, то конфигурацию каждого хоста нужно вписывать в php.ini при помощи секций.

    или это делается, просто путем перечисления все возможных путей, типа:
    php_value[open_basedir] = /var/www/example.com/:/tmp/:/var/www/mysite.com/ ?

    Такая настройка сводит на нет всю идею open_basedir, так как скрипты сайта example.com будут иметь доступ к папке mysite.com.

    Имея 2 домена: example и mysite, задаем права:
    chmod nginx:mysite -R 750 /var/www/mysite/
    chmod nginx:example -R 750 /var/www/example/
    тем самым пользователь www-data - или другой, но не nginx, который не имеет прав доступа к этой папке

    Написали "... или другой, но не nginx, ...", но при этом "chmod nginx:mysite". Как же так?
  • Какой путь прописать для upload_tmp_dir?

    Vamp
    @Vamp
    В конфиге nginx нельзя устанавливать опции PHP с уровнем PHP_INI_SYSTEM, который как раз и имеют open_basedir (с оговорками), upload_tmp_dir и sys_temp_dir. Опция session.save_path имеет уровень PHP_INI_ALL, поэтому её можно установить откуда угодно. Хоть из php скриптов.

    PHP_INI_SYSTEM можно установить только в php.ini или конфигурации пула:

    php_value[open_basedir] = /var/www/mysite.ru/:/tmp/
    php_value[upload_tmp_dir] = /var/www/mysite.ru/tmp/
    php_value[sys_temp_dir] = /var/www/mysite.ru/tmp/
    php_value[session.save_path] = /var/www/mysite.ru/sessions/


    Конфигурации пулов могут быть в отдельных файлах в папке /etc/php7/pool или в одном - это дело вкуса. Проще разделять по разным.

    Что до разделения по юзерам, то нужно создавать отдельные пользовательские группы для каждого сайта:

    ; Имя пула
    [mysite]
    
    ; Пользователь и группа
    user = www-data
    group = mysite
    
    ; Прием FastCGI-запросов
    listen = /var/run/mysite.sock
    
    ; Пользователь и группа, который будет владельцем unix сокета
    listen.owner = nginx
    listen.group = nginx
    
    ; Права на чтение и запись
    listen.mode = 0660
    
    ; добавляем конфиг php
    php_value[open_basedir] = /var/www/mysite.ru/:/tmp/
    php_value[upload_tmp_dir] = /var/www/mysite.ru/tmp/
    php_value[sys_temp_dir] = /var/www/mysite.ru/tmp/
    php_value[session.save_path] = /var/www/mysite.ru/sessions/


    ; Имя пула
    [vasya]
    
    ; Пользователь и группа
    user = www-data
    group = vasya
    
    ; Прием FastCGI-запросов
    listen = /var/run/vasya.sock
    
    ; Пользователь и группа, который будет владельцем unix сокета
    listen.owner = nginx
    listen.group = nginx
    
    ; Права на чтение и запись
    listen.mode = 0660
    
    ; добавляем конфиг php
    php_value[open_basedir] = /var/www/vasya/:/tmp/
    php_value[upload_tmp_dir] = /var/www/vasya/tmp/
    php_value[sys_temp_dir] = /var/www/vasya/tmp/
    php_value[session.save_path] = /var/www/vasya/sessions/


    Соответственно, права и владелец папки /var/www/mysite.ru должны быть tolly:mysite и 750, а у /var/www/vasya - tolly:vasya и 750.

    Не сильно важно от какого пользователя будут запускаться разные php-fpm пулы, главное чтобы не от nginx или tolly. Разграничение доступа при такой схеме строится только на группах.

    Пользователь nginx должен состоять одновременно в группах mysite и vasya, чтобы иметь доступ к файлам всех сайтов, тогда как php-fpm пул будет иметь доступ только к своей папке, но не к папке соседа.
  • Неправильно приходят байты?

    Vamp
    @Vamp
    Возможно из-за того, что кор.