• Как включить SSLv3 для mailcow?

    @q2digger
    никого не трогаю, починяю примус
    Я просто оставлю ссылку на статью почему sslv3 должен быть отключен
    https://blog.mozilla.org/security/2014/10/14/the-p...
    Ответ написан
    1 комментарий
  • Как включить SSLv3 для mailcow?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    sslv3 давным-давно сдох, разложился, сгнил и мумифицировался. Возможно, как-то его можно реанимировать пересборкой openssl, но как только я вижу слово "докер" я сразу понимаю, что советовать тут пересборку openssl - примерно то же самое, что писать коммент по-японски :)

    Dōse dare mo nani mo rikai dekinaidarou (ромадзи)
    Ответ написан
    2 комментария
  • Как заменить switch case паттерном стратегия?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Switch
    public enum DamageType { Melee, Range, Magic }
    public class Monster
    {
        public double Health { get; private set; }
        public double MeleeDamage { get; private set; }
        public double RangeDamage { get; private set; }
        public double MagicDamage { get; private set; }
        public DamageType FavoriteDamageType { get; private set; }
    
        public Monster(double health, double meleeDamage, double rangeDamage, double magicDamage, DamageType favoriteDamageType)
        {
            Health = health;
            MeleeDamage = meleeDamage;
            RangeDamage = rangeDamage;
            MagicDamage = magicDamage;
            FavoriteDamageType = favoriteDamageType;
        }
    
        public void AttackTo(Monster monster, DamageType damageType)
        {
            switch (damageType) // используется switch
            {
                case MonsterType.Melee: monster.Health -= MeleeDamage; break;
                case MonsterType.Range: monster.Health -= RangeDamage; break;
                case MonsterType.Magic: monster.Health -= MagicDamage; break;
            }
        }
    
        public void AttackTo(Monster monster)
        {
            AttackTo(monster, FavoriteDamageType);
        }
    }


    То же самое, но со стратегией
    public class Monster
    {
        public double Health { get; set; }
        public double MeleeDamage { get; private set; }
        public double RangeDamage { get; private set; }
        public double MagicDamage { get; private set; }
        public IDamageStrategy FavoriteDamageStrategy { get; private set; }
    
        public Monster(double health, double meleeDamage, double rangeDamage, double magicDamage, IDamageStrategy favoriteDamageStrategy)
        {
            Health = health;
            MeleeDamage = meleeDamage;
            RangeDamage = rangeDamage;
            MagicDamage = magicDamage;
            FavoriteDamageStrategy = favoriteDamageStrategy;
        }
    
        public void AttackTo(Monster monster, IDamageStrategy damageStrategy)
        {
            damageStrategy.Attack(this, monster); // не используется switch
        }
    
        public void AttackTo(Monster monster)
        {
            AttackTo(monster, FavoriteDamageStrategy);
        }
    }
    
    
    public interface IDamageStrategy
    {
        void Attack(Monster attacker, Monster defender);
    }
    public class MeleeDamageStrategy : IDamageStrategy 
    {
        public void Attack(Monster attacker, Monster defender)
        {
            defender.Health -= attacker.MeleeDamage;
        }
    }
    public class RangeDamageStrategy : IDamageStrategy 
    {
        public void Attack(Monster attacker, Monster defender)
        {
            defender.Health -= attacker.RangeDamage;
        }
    }
    public class MagicDamageStrategy : IDamageStrategy 
    {
        public void Attack(Monster attacker, Monster defender)
        {
            defender.Health -= attacker.MagicDamage;
        }
    }

    Отличие класса Monster только в коде первого метода AttackTo. Ну и свойства FavoriteDamageType или FavoriteDamageStrategy.

    Стратегия может быть полезна, если код атаки, в зависимости от типа, сильно отличается, используя внешние данные (не из класса монстра), например, день или ночь, ясно/дождь и пр. Использование стратегии переносит часть кода из класса монстра (и так сложного класса) в несколько простых классов.
    Ответ написан
    1 комментарий
  • Mailcow за nginx?

    Daemon23RUS
    @Daemon23RUS
    2 проксированых nging порта для веб интерфейса недостаточно, для полноценного почтового сервера Вам еще надо пробросить imap/pop3,smtp и не забыть про шифрование. Можно с помощью Nginx,
    вот пример
    mail {
        auth_http   localhost/auth.php;
    
        proxy_pass_error_message on;
    
        server {
            listen    25;
            protocol  smtp;
            smtp_auth login plain cram-md5;
        } 
    
        server {
            listen    110;
            protocol  pop3;
            pop3_auth plain apop cram-md5;
        }
    
        server {
            listen   143;
            protocol imap;
        }
    }
    найдете в сети и как для SSL все это сделать.
    А вот MX запись надо будет сменить на Ваш сервер (когда все у Вас заработает).
    2 imap записи - 2 учетные записи, 2 разных сервера. Все остальное будет каша.
    И уже потом, как все будет работать, занятся автоконфигом под почтовые программы.
    PS забыл еще про SUBMISSION_PORT=587 указать.
    PSS наверно проще будет пробрасывать порты в роутере на убунту, а в убунте пробрасывать в докер.
    Ответ написан
    4 комментария
  • Как правильно и удобнее всего разрабатывать модульное ПО?

    vabka
    @vabka
    Токсичный шарпист
    25 проектов в решении - это вполне нормальное количество и ничего особенного с этим делать не нужно. (Видел решения, где их под сотню).
    Хотя не исключаю вариант, что на самом деле такое разделение излишнее.

    Добавление nuget, сабмодулей и другого подобного - только усложнит процесс, особенно если ты разрабатываешь это в одиночку и принесёт только вред, если ч помощью них ты хотел только облегчить жизнь.

    Лучше попробуй конкретизировать, как именно проявляется неудобство - тогда и будет вариант решения.
    Подумай, почему у тебя вообще столько проектов?
    Можно ли их объединить? Если нельзя, то почему ты так думаешь?

    PS: из текстового описания вообще не понятно, что такое "слои" и почему между ними нужно как-то перемещаться. Попробуй добавить в вопрос пример иерархии папок из твоего репозитория.
    Ответ написан
    7 комментариев
  • С чего начать обучение программированию?

    @tyxeo
    дальний знакомый Мурыча
    я бы начал с математики и понимания как работают транзисторы
    и тогда не будет вопросов о том как работает процессор
    ну и с машинных кодов
    Ответ написан
  • Лучшая книга по с# с нуля?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Лично я учился по metanit и каналу ExtremeCode. Не уверен, что это подойдёт для совсем новичков, тк до этого уже пробовал писать на C++ (учил по Парте) и Python
    Ответ написан
    3 комментария