• Перенос почтового сервера как лучше?

    @MechanID
    Админ хостинг провайдера
    Я бы действовал примерно по такому плану:
    1 настроил новый почтовый сервер на linux, что именно выбор за вами: своя сборка postfix,dovecot,mysql,rouncube,postfixadmin или какойто готовый комбайн типа zimbra.
    2 на новом сервере создал бы ящики такие же как на старом сервере.
    3 заранее при помощи утилиты imapsync или аналогов залил бы основную часть почты в новый сервер со старго сервера.
    4 в день Д (например на выходных) обьявил бы тех работы, переключил входящую почту на новый сервер, и дозалил темже imapsync дельту писем пришедших после предыдущей заливки на новый сервер.
    5 готово - старый сервер уже не у дел.
    Ответ написан
    Комментировать
  • Hetzner 〉 Proxmox 〉 VM00. Как пробросить порты?

    danielnewman
    @danielnewman Автор вопроса
    Front-end
    Найдена причина:
    post-up iptables -t nat -A POSTROUTING -s '10.10.11.0/24' -o net0 -j MASQUERADE

    вместо
    post-up iptables -t nat -A POSTROUTING -s '10.10.11.0/24' -o eth0 -j MASQUERADE


    В примерах настройки eth0 следовало заменить на TAP виртуальной машины. Всего-то.
    Спасибо за минус за вопрос.

    serverfault.com/questions/421357/debian-kvm-host-and-guests-interfaces-configuration
    Ответ написан
    Комментировать
  • Трюк с тернарным оператором PHP?

    @Flying
    В целом то, что вам нужно скорее ближе к новой функциональности в PHP 8: throw expression. В этом случае ваш код мог бы выглядеть, к примеру, вот так:
    Auth::check() ?? throw new AuthenticationRequiredException("Вам необходимо сначала авторизоваться");

    Однако, если вы реально хотите именно такой конструкции как ваша - то здесь, конечно, тоже есть варианты, ведь начиная с PHP 7 нам доступен uniform function call syntax и, следовательно, возможны конструкции вида:
    Auth::check() ?? (function(){echo "Вам необходимо сначала авторизоваться";})();

    Конечно, я ни в коем случае не призываю делать именно так, это плохое решение, но технически возможное.

    Существенно лучшим вариантом в этом случае на самом деле будет просто создание отдельной функции, которая будет брать на себя реакцию на такие ситуации:
    function failure(string $error): void 
    {
      // Просто для того чтобы быть ближе к вашему примеру, 
      // в реальности здесь должна быть нормальная логика обработки, 
      // к примеру тот же throw new RuntimeExcepton($error);
      echo $error;  
    }

    в этом случае ваш пример сводится к:
    Auth::check() ?? failure("Вам необходимо сначала авторизоваться");

    Помимо этого обратите внимание на то, что использование null coalescing operator ?? подразумевает, что тип возвращаемого значения функции Auth::check() - это mixed|null что выглядит странно, поскольку от результата проверки ожидается тип boolean.

    В реальности здесь лучше подходит сокращённая версия тернарного оператора, т.н. elvis operator. В этом случае ваш код может выглядеть вот так:
    class Auth {
        public static function check(): bool 
        {
            return false;
        }
    }
    
    function failure(string $error): void 
    {
        // В реальности, как указано выше, лучше использовать 
        // throw new RuntimeException($error);   
        // echo используется для примера
        echo $error;
    }
    
    Auth::check() ?: failure('Вам необходимо сначала авторизоваться');

    Проверить можно здесь.
    Ответ написан