• Mailcow за nginx?

    Lapish72
    @Lapish72 Автор вопроса
    В общем, мне помогли донастроить сервер и вот какие были ошибки:
    1) autodiscover/autoconfig необязательны, но желательны. Без них надо вручную прописывать imap/smtp для сервера
    2) Ошибка при которой не отправляются письма даже при открытых портах - отсутствие сертификата в самом mailcow. Сертификат я генерировал в NPM, но не копировал его в mailcow.
    Ответ написан
    Комментировать
  • Передача сообщения через SignalR. Как сделать однократное соединение с сервером?

    Lapish72
    @Lapish72
    Нет примера вызова методов из вашего класса, но могу предположить, что вы каждый раз инициализируете его. Вам нужно сделать ваш класс Singleton'ом. Для этого в Startup ConfigureServices зарегистрируйте ваш сервис:
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<ВашСервис>();
        }
    }

    И затем в Program:
    public class Program
    {
        public static async Task Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();
            var service = host.Services.GetRequiredService<ВашСервис>();
            service.ConnectToServer(); //Подключаемся к SignalR
    
            host.Run();
        }
    }


    UPD:
    Советую поменять название класса на более общее, например, SignalrService, а метод SendToSignalR на Connect.
    Ответ написан
    6 комментариев
  • На чем пишутся современные десктопные приложения?

    Lapish72
    @Lapish72
    C# уже много лет спокойно работает на линуксе. На c# можно писать кроссплатформенный gui через:
    1) Avalonia. Наследник WPF с исправлением болячек wpf(тех же стилей) и реактивностью по умолчанию.
    2) UNO. Многообещающий проект, но лично мне не понравился. Слишком тяжеловесное решение и сложное. Avalonia проще и завелась сразу.
    3) Maui. Официальное решение от Microsoft, но не под линукс. На github пилят отдельно под него поддержку.
    4) Blazor/Electron.Net. Web app в виде десктопа.

    JavaFX. Сугубо субъективное мнение, но это тихий ужас по сравнению с тем же WPF.

    Для себя хочу изучить Dart и Flutter из-за быстрой перезагрузки(тот же wpf, а особеннно у blazor с этим проблемы) и 100% следования material guidline, т.к это все google. На Flutter ui пишется под все платформы и его практически не нужно будет подгонять.
    Ответ написан
    Комментировать
  • Какие технологии и подходы использовать?

    Lapish72
    @Lapish72
    Как вы заметили при вашем подходе, например, 10 компьютеров при тайминге опроса 1с отправят как минимум 36к запросов к базе за 1час. 1 день 864к строк+ Это если вам нужно хранить супер подробную статистику.

    Как бы сделал я:
    Данные отправляются не напрямую в бд, а в какой-то промежуточный сервис, который к примеру будет анализировать данные за 1 час или 24ч, проводить с ними манипуляции(большинство данных удалять, а остаток перекладывать в другую таблицу для менее детальных отчетов). Из тех же +/- 3600 строк от одного компьютера можно оставить 4 по среднему значению за 15 минут. Экономия ресурсов в 900 раз.

    UPD:
    Если поставить периода "чистки" базы 2ч, то в приложении мы можем показать нагрузку как посекундно, ведь не удалились еще полные данные, так и более детально для данных >1ч.
    Ответ написан
    1 комментарий
  • Как отключать ContextMenu на дочерних элементах?

    Lapish72
    @Lapish72 Автор вопроса
    UserControl.xaml
    <UserControl.Resources>
        <ContextMenu x:Key="AmazingMenu">
            <MenuItem Header="Item1"/>
            <MenuItem Header="Item2"/>
        </ContextMenu>
    </UserControl.Resources>
    
    <Grid x:Name="MegaGrid" Background="Transparent" MouseRightButtonDown="Grid_MouseRightButtonDown">
        <!-- Some controls -->
    </Grid>


    UserControl.xaml.cs
    private void Grid_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        var control = e.OriginalSource as Grid;
    
        if (control.Name.Equals("MegaGrid"))
        {
            MegaGrid.ContextMenu = FindResource("AmazingMenu") as ContextMenu;
        }
        else
        {
            MegaGrid.ContextMenu = null;
        }
    }
    Ответ написан
    Комментировать