• Тип данных с плавающей точкой в 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
    Возможно из-за того, что кор.
  • Неправильно приходят байты?

    Vamp
    @Vamp
    Размер пакета регулируется операционной системой. Повлиять на это вы не можете.
  • Неправильно приходят байты?

    Vamp
    @Vamp
    Никак. Это фундаментальная особенность работы сети. Если не хотите заниматься сборкой пакетов вручную, то найдите того, кто будет делать это за вас. Я не в курсе что предлагает spigot для решения этой проблемы, но видел плагин ProtocolLib. Вероятно, он может помочь.
  • Как команда ping преобразует адреса?

    Vamp
    @Vamp
    Тут не в протоколе дело, а в софте, его имплементирующем. Судя по всему, протестированные вами реализации SSH и RDP используют эту же самую функцию для преобразования адреса из char массива в структуру in_addr. Только и всего.
  • Как запретить на сайте нажатие CTRL+SHIFT+I и F12?

    Vamp
    @Vamp
    Так автор не знает - можно или нет. Иначе не спрашивал бы.
  • PHP SOAP и сертификат?

    Vamp
    @Vamp
    Тем не менее, другие люди будут приходить из гугла и копипастить ваш ответ в свои проекты бездумно, даже не догадываясь о последствиях. Хотя бы добавьте в ответ ремарку о том, что это решение костыльное и небезопасное.
  • Как вывести все существующие символы?

    Vamp
    @Vamp
    На каком языке требуется пример? В тегах java и javascript, а в примере вообще php. Три совершенно разных языка.
  • Зачем и где именно писать @Override?

    Vamp
    @Vamp
    Показателен пример с переопределением Object.equals(Object) - люди часто ошибаются с сигнатурой: class MyClass { public boolean equals(MyClass o) { /* blah-blah */ } }. В итоге определили новый метод, а не переопределили родительский. Причём ошибка может не сразу обнаружиться.

    Ладно equals() можно запомнить очень быстро. Базовый метод, как-никак. Часто на слуху. Но в нетривиальных случаях можно неплохо подпортить себе нервы, пытаясь отдебажить проблему, которую можно было переложить на компилятор аннотацией @Override.