Задать вопрос
  • Как создать методы контроллера для создания сущностей 2 классов?

    @cicatrix
    было бы большой ошибкой думать
    Я бы вообще сделал один метод на контроллере, а с командой создавать или без, регулировал бы переданным в запросе параметром.
    Ответ написан
    Комментировать
  • WPF или Windows?

    @cicatrix
    было бы большой ошибкой думать
    И то, и другое - фреймворки для разработки GUI (Графического пользовательского интерфейса).
    И этими двумя выбор, в принципе, не ограничивается. Существуют и другие:
    Avalonia
    Qt
    wxWidgets
    Да и другие есть, кто-то больше, а кто-то меньше приспособлен для C#. В целом, даже на UnityEngine можно GUI сделать (да ещё какой!). Так же, к программе можно сделать и веб-интерфейс.

    Тут следует понять, что GUI - это оболочка. Сама по себе она должна отрисовать окошки, кнопочки, текстовые поля, списки и пр., но остальное всё должна делать программа, написанная разработчиком.
    Хорошей практикой вообще считается писать так, чтобы как можно меньше была привязка программной логики к графической оболочке. Сама программа может вообще быть скомпилирована в class library, а уж интерфейс потом к ней можно пристыковывать любой.

    Если ты новичок, то особо не заморачивайся с интерфейсами. Для начала научись самому языку, для обучения подойдёт и командная строка. Не стоит думать, что твоя первая программа будет пользоваться настолько большим спросом, что к ней вообще потребуется граф. интерфейс. Да, разумеется, изучать особенности той или иной граф. библиотеки придётся, но это потом. Сначала нужно освоить сам язык.

    Что проще сказать сложно. Мне вот проще WF, но исключительно потому, что это первое (и на тот момент - единственное, что вообще было доступно для C#), сейчас выбор богаче.
    Есть так называемый "синдром утёнка", обычно люди хвалят то, что увидели и освоили первым (так утёнок, якобы, считает первое увиденное им существо своей мамой). Поэтому я и говорю - не стоит акцентировать внимание на GUI, сам язык важнее.
    Ответ написан
    Комментировать
  • Требуется расшифровать набор символов но не знаю каким методом?

    @cicatrix
    было бы большой ошибкой думать
    Base64 раскодируется в эту последовательность:
    74 80 8f dc 06 a8 be 7c b0 a4 a0 db be 3d 06 42
    Но никакого осмысленного текста здесь нет. Если это двоичные данные, то без контекста, это может быть что угодно.
    Ответ написан
    2 комментария
  • Как искать элементы в xml без имени?

    @cicatrix
    было бы большой ошибкой думать
    Вопрос первый: а если ты их добавляешь динамически, чего ты ссылки на них не хранишь в массиве, например?
    Если по каким-то причинам ты так делать не хочешь, вопрос второй - тэг Content предназначен для указания... контента (содержимого) элемента, но никак не метки (имени). Для этого есть атрибут "Name"
    Ну а так:
    .Where(l => l.Content.Contains("EtalonName"));
    Ответ написан
    8 комментариев
  • Как убрать ошибку?

    @cicatrix
    было бы большой ошибкой думать
    Написано "Сервер не найден или недоступен".
    Действительно, переводить не надо, надо тонны нерелевантного кода написать, вместо того, чтобы текст ошибки перевести.
    Ответ написан
  • Как парвильно обратиться к контроллеру, передав в качестве параметра массив?

    @cicatrix
    было бы большой ошибкой думать
    Попробуй
    http://localhost:5000/api/Rtb/GetParam?ids=68&ids=65

    Но вообще, массивы в контроллер передавать GET-ом, на мой взгляд, извращение.
    Ответ написан
  • Как лучше организовать хранение курсов валют?

    @cicatrix
    было бы большой ошибкой думать
    6 знаков после запятой может оказаться мало, в теории, я бы взял 8 на всякий случай
    По организации таблиц для начала надо понять, как эти таблицы будут использоваться.
    Если будет выборка типа "выбрать котировки по всем валютам на дату", то дата должна быть ключом (или индексом), тогда так:
    ДАТА / туева хуча столбиков

    Если выборка типа "выбрать все котировки по монгольскому тугрику", то ключом (индексом) должен быть код валюты.
    КОД ВАЛЮТЫ / Дата / Курс

    TimeStamp нужен только если у тебя в течение одного дня меняется значение. Обычно курсы устанавливаются на день, соответственно, одной даты достаточно.
    Ответ написан
    2 комментария
  • Как такое может быть. Разный результат при "меньше либо равно" и "BETWEEN" для одной даты?

    @cicatrix
    было бы большой ошибкой думать
    Вот ссылка:
    https://www.techonthenet.com/mysql/between.php
    Где написано
    When using the MySQL BETWEEN Condition with dates, be sure to use the CAST function to explicitly convert the values to dates.

    Точно не могу сказать, в чём разница между
    STR_TO_DATE('2021-04-14 23:59:59', '%Y-%m-%d %H:%i:%s')
    и
    CAST('2014-02-01' AS DATE)
    но, возможно, она есть.

    Кроме того, возможно, играет роль не даты, а времени.
    2021-04-14 < 2021-04-14 11:46:23
    Ответ написан
  • Почему важно "Разделение ответственности"?

    @cicatrix
    было бы большой ошибкой думать
    Абстрактно если, псевдокодом
    password = Window.TextBoxPassword.Value
    if (!password.RegexMatch('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$"))
         Window.ValidationText.Text = "Пароль слишком слабый";
    else
         try
             connection = new Connection("connecttion string to database");
             .RunSQL("update users set password = @password where username = @user"
         catch  
             Window.ResultMessage.Text = "Ошибка"
    Window.ResultMessage.Text = "Пароль изменён"


    И таких кусков в программе, например 3, где меняется павроль, но ты знаешь только про 2, так как третий добавили без тебя.
    Вопросы: что будет, если изменятся требования к паролю?
    Что будет, если изменится оконный дизайн или вообще UI фреймворк?
    Что будет, если изменится движок бд, названия таблиц?

    сравни c:
    password = GetUserInput();
    if (ValidatePassword())
    {
        UpdateUserPassword()
    }
    Ответ написан
    1 комментарий
  • Как написать поиск-фильтрацию по всем типам?

    @cicatrix
    было бы большой ошибкой думать
    Как-то так, наверное:
    public static IQueryable<T> ApplyFiltering<T>(
        this IQueryable<T> source, 
        string propertyName, 
        string filter)
    {
            filter = filter.ToLower(); // выключить зависимость от регистра
            return source
                .Where(item => 
                item.GetType()
                .GetProperty(propertyName)
                .GetValue(item, null)
                .ToString().ToLower().Contains(filter));
    } // ApplyFiltering
    Ответ написан
  • Что такое курсор (cursor) в базах данных?

    @cicatrix
    было бы большой ошибкой думать
    Давай попробую на пальцах. Представь у тебя многоэтажный склад (таблица). На каждом этаже хранятся коробки (данные). Чтобы добраться до данных (SELECT) надо на лифте подняться на нужный этаж и достать (FETCH) эти коробки. Вот лифт - это и есть твой курсор, если всё очень и очень упростить.
    Ответ написан
  • Как в C Sharp выдавать ошибку при неправильном вводе?

    @cicatrix
    было бы большой ошибкой думать
    Вместо Convert.ToDouble ипсользуй Double.TryParse
    Он вернёт false, если не удалось преобразование.
    Как-то так:
    double x1;
    do
    {
       Console.Write("Введите x1: ");
    } while (!double.TryParse(Console.ReadLine(), out x1))

    P.S. Имей в виду, что успех или неуспех преобразования ещё зависит от принятого в локали системы разделителя целой и дробной части (точка или запятая). Но это уже отдельный геморрой.
    Ответ написан
  • Как крякнуть защищенную программу?

    @cicatrix
    было бы большой ошибкой думать
    Это отдельное направление, которое называется Реверс-инжиниринг.
    Те, кто этим занимается, это действительно, своего рода, "элита", так как там не существует готовых методик, шаблонных решений и пр. Каждая новая программа - чёрный ящик, который надо разобрать и посмотреть, как он работает, при этом ты ничего не знаешь о том, что было на уме у его создателя.
    Разумеется, любая защита обходится, но дело это кропотливое, долгое, требующее хороших знаний языка ассемблера для той линейки процессоров, под который программа написана.
    Для C# существует IL-Spy или похожие дисассемблеры, которые действительно позволяют получить некое подобие исходного кода, но, зачастую, даже имея на руках код (очень часто обфуцированный) предстоит ещё очень долгая, нудная и кропотливая работа только для того, чтобы разобраться, что там вообще происходит.
    Кряк "взлом" программы часто сводится к подмене результата проверки условия. Простой if, казалось бы. Однако найти нужное место в машинном коде или в памяти процесса - очень и очень сложно.

    Сразу говорю, что кракером быстро не становятся. На это могут потребоваться годы наряжённого труда и самообучения (помните - этому никто не сможет научить, этому можно только научиться самому), методом проб и ошибок. А каждый новый взлом - это новая задача, требующая новых знаний и совсем других подходов.
    Ответ написан
    Комментировать
  • Как исправить ошибку при подключении к MS SQL Server в ASP Net Core приложении на Ubuntu?

    @cicatrix
    было бы большой ошибкой думать
    Судя по этому сообщению:
    (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed

    Вполне возможно, в системе не хватает нужного доверенного сертификата.
    Ответ написан
    Комментировать
  • Можете дать идеи для проектов на языке C#?

    @cicatrix
    было бы большой ошибкой думать
    Ну напиши мессенджер. Чтобы и p2p и через сервер. И веб-клиент.
    Протокол сделай безопасный. Шифрование, локальные базы данных. И чтобы с эмоджами, и картинки и видео пересылать можно было. Кросс-платформенный. Чтобы и на iOS, и на Android, и на Linux, и на Windows, и на MacOS.
    Ответ написан
    Комментировать
  • Есть ли программа для создания алгоритма действий?

    @cicatrix
    было бы большой ошибкой думать
    По-моему это реализуется простым html.
    Вопрос и гиперссылки на возможные ответы.
    В целом, даже в ворде можно сделать.
    Ответ написан
    Комментировать
  • Какие есть инструменты для проверки веса страниц сайта?

    @cicatrix
    было бы большой ошибкой думать
    Ещё вопрос, что называть "весом".
    Вот сайт на 3 домена х с картинками и видео, причём часть хостится на самом сайте, а часть на YouTube, например.
    Плюс скрипты с левого cdn. Причём сам скрипт на 3 Кб, а при исполнении динамически генерирует контента на 2 Мб.
    Что из этого считать, а что - нет?
    В общем, ересь какая-то.
    Ответ написан
    Комментировать
  • Как правильно построить функцию?

    @cicatrix
    было бы большой ошибкой думать
    Короче, вот готовый пример, как работать с матрицами трансформации. Это действительно проще показать, чем объяснить
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    
    namespace DrawPlot
    {
        public partial class MainForm : Form
        {
            // Добавил сюда, чтобы в InitializeComponent не лезть
            PictureBox picDisplay;
    
            // Макс размер сетки по наибольшему измерению окна 
            // для сохранения пропорции (либо по ширине, либо по высоте)
            const float MaxGrid = 10.0f;
    
            // Это задаёт логический размер окна
            SizeF viewPort;
    
            // Шаги сетки 
            const float GridStep = 0.1f;
            // Каждые 10 линий сетки делаем линию поярче
            const int BoldLineStep = 10;
    
            // Цвета        
            Pen pen_LargeGrid = new Pen(Color.FromArgb(0,64,0));
            Pen pen_SmallGrid = new Pen(Color.FromArgb(0,32,0));        
            Pen pen_Axii = new Pen(Color.FromArgb(0,128,0));
            SolidBrush plotBrush = new SolidBrush(Color.Red);
    
            // Ширина 1 пиксела в логических размерах
            float Pixel_Width;
    
            public MainForm()
            {
                InitializeComponent();
                picDisplay = new PictureBox() { Parent = this, Dock = DockStyle.Fill, BackColor = Color.Black };
                picDisplay.Paint += this.PicDisplay_Paint;
                picDisplay.Resize += this.PicDisplay_Resize;
                // Стрелочка 10х4
                AdjustableArrowCap cap = new AdjustableArrowCap(4.0f,10.0f);
                pen_Axii.CustomEndCap = cap;
                CalculateDimensions();
            } // MainForm Ctor       
    
            private void PicDisplay_Resize(object sender, EventArgs e)
            {
                CalculateDimensions();
                picDisplay.Invalidate();
            } // PicDisplay_Resize
    
            private void CalculateDimensions()
            {
                var rect = picDisplay.ClientRectangle;
                // Устанавливаем размеры в зависимости от того, что больше, длина или ширина
                // для сохранения квадратной сетки
                if (rect.Width > rect.Height)
                    viewPort = new SizeF(MaxGrid, MaxGrid * (rect.Height / (float)rect.Width));
                else
                    viewPort = new SizeF(MaxGrid * (rect.Width / (float)rect.Height), MaxGrid);
                // Считаем ширину 1 пикселя 
                Pixel_Width = viewPort.Width / rect.Width;
                // Назначаем эту ширину используемым перьям
                foreach (var pen in new Pen[] { pen_Axii, pen_LargeGrid, pen_SmallGrid, pen_LargeGrid })
                    pen.Width = Pixel_Width;
            } // CalculateDimensions
    
            private void PicDisplay_Paint(object sender, PaintEventArgs e)
            {            
                Graphics g = e.Graphics;
                
                // Масштабируем
                g.ScaleTransform(picDisplay.Width / viewPort.Width, (picDisplay.Height / viewPort.Height));
    
                // Двигаем начало координат в середину
                float halfWidth = viewPort.Width / 2;
                float halfHeight = viewPort.Height / 2;
                g.TranslateTransform(halfWidth, halfHeight);
    
                // Переворачиваем Y
                g.ScaleTransform(1.0f, -1.0f);
    
                // Рисуем сетку
                int step = 0;
                for(var f = 0f; f < MaxGrid / 2 ; f += GridStep)
                {
                    var currentPen = pen_SmallGrid;                
                    if (0 == step % BoldLineStep) currentPen = pen_LargeGrid;
                    // Горизонтальные
                    g.DrawLine(currentPen, -halfWidth, f, halfWidth, f);
                    g.DrawLine(currentPen, -halfWidth, -f, halfWidth, -f);
                    // Вертикальные
                    g.DrawLine(currentPen, f, -halfHeight, f, halfHeight);
                    g.DrawLine(currentPen, -f, -halfHeight, -f, halfHeight);
                    step++;
                } // for
                // Оси координат
                g.DrawLine(pen_Axii, -halfWidth, 0, halfWidth, 0);
                g.DrawLine(pen_Axii, 0, -halfHeight, 0, halfHeight);
    
                // график
                float y;
                for (var x = -halfWidth ; x < halfWidth ; x+= Pixel_Width)
                {
                    y = ((float)Math.Pow(x, 3) - 1) / (x + 5);
                    // Обязательно проверка на NaN и Infinity
                    if (!float.IsNaN(y) && !float.IsInfinity(y)) 
                          g.FillRectangle(plotBrush, new RectangleF(x, y, Pixel_Width, Pixel_Width));
                } // for
            } // PicDisplay_Paint
        } // class MainForm`    1+m  
    } // DrawPlot namespace


    6076227c0d1d2664851754.png
    Ответ написан
    1 комментарий
  • Загрузка больших файлов c#?

    @cicatrix
    было бы большой ошибкой думать
    4 гига, уж очень подозрительная цифра.
    Подозреваю, что где-то int переполнился.
    А, ну и на всякий случай посмотреть, что за файловая система. Fat файлы более 4 гигов не поддерживает. По той же причине.
    Ответ написан
    Комментировать