• Как правильно создать скриншот неактивного окна?

    @cicatrix
    было бы большой ошибкой думать
    Когда Direct3d переходит в полноэкранный режим, оно получает эксклюзивный прямой доступ к видеокарте (то есть, минуя ОС), поэтому стандартные средства операционной системы для получения скриншотов не подойдут. ОС понятия не имеет, что там внутри окна нарисовано. Для получения скриншота необходимо зацепляться за рендерер.

    Taking the screenshot itself is relatively straightforward. Once the scene has been rendered, the Direct3D device offers a GetRenderTarget function that returns a pointer to a Direct3D surface with the current scene. Using a SurfaceToBitmap function, the RenderTarget can be converted to a Bitmap object, which can then be saved as either a JPEG or PNG to disk. Below is an example of the code involved:

    Bitmap screenshot = Funcs.SurfaceToBitmap(device.GetRenderTarget(0));
    screenshot.Save(Frame.ToString() + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    screenshot.Dispose();


    https://www.apharmony.com/software-sagacity/2014/0...
    Ответ написан
  • Проблема дизайна или как решить циклическую зависимость?

    @cicatrix
    было бы большой ошибкой думать
    С точки зрения реляционной модели данных, подразделение не должно содержать ссылок на пользователей, достаточно ссылки пользователя на подразделение. Тут ещё надо иметь в виду транзакционные издержки при переводе пользователей из одного подразделения в другое - это обновление двух связей и потенциальный риск рассогласования.
    Ответ написан
    Комментировать
  • Как вывести исключения для опеределенного исключения?

    @cicatrix
    было бы большой ошибкой думать
    Где-то всё равно выбор придётся делать.
    1) Можно сделать своё исключение, наследуемое от System.Exception и заворачивать внутрь исключение, которое выбросилось
    2) Сообщение об ошибке можно передавать в теле исключения (message)

    try
        {  
           /// 
        }
        catch(InvalidOperationException ex)
        {
            throw new MyCustomException("Случилось страшное", ex);
        }
        catch(DataException ex)
        {
            throw new MyCustomException("Не менее страшное", ex);
        }
        catch (Exception ex)
        {
            throw new MyCustomException("Тут вообще хз что произошло", ex);
        }

    При этом, первоначальное исключение будет в свойстве InnerException
    Ответ написан
    Комментировать
  • Как лучше реализовать история цены в отчетах?

    @cicatrix
    было бы большой ошибкой думать
    А чего тут думать?
    ID товара / Дата изменения / Цена
    Ответ написан
    3 комментария
  • Аналог DotVVM для asp.net web forms?

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

    @cicatrix
    было бы большой ошибкой думать
    Не создавай много потоков.
    Если хочешь заморочиться, то можно отслеживать состояние памяти процесса и регулировать их количество. Если не заморачиваться, то прирост производительности от параллельного исполнения ограничен количеством ядер процессора.
    То, что ты описал, подходит под паттерн - производитель-потребитель.
    Пример реализации
    Ответ написан
    Комментировать
  • Как генерировать/перебирать строку в пределах диапазона?

    @cicatrix
    было бы большой ошибкой думать
    А алфавит-то какой? 0-9A-Z, 0-9A-z, 0-9A-F или ещё какой?
    Может 4-й разряд принимать буквенные значения? Для каждого разряда разные алфавиты?

    class ComplexValue
        {
            const string m_Alphabet = "abcdefghijklmnopqrstuvwxyz";
            int First { get; set; }
            char[] Middle { get; set; };
            int Last { get; set; }
            public ComplexValue(string input)
            {
                First = int.Parse(input.Substring(0, 1));
                Middle = input.Substring(1, 3).ToCharArray();
                Last = int.Parse(input.Substring(input.Length - 1, 1));
            }
    
            public string Value() => $"{First}{new string(Middle)}{Last}";
    
            private int IncrementLast()
            {
                Last++;
                if (Last > 9) { Last = 0; return 1; }
                return 0;
            }
    
            private int DecrementLast()
            {
                Last--;
                if (Last < 0) { Last = 9; return 1 }
                return 0;
            }
    
            private char IncrementChar(char c, out bool carry)
            {
                carry = false;
                c++;
                if (c > m_Alphabet[m_Alphabet.Length -1] )
                {
                    c = m_Alphabet[0];
                    carry = true;
                }
                return c;
            }
    
            private char DecrementChar(char c, out bool borrow)
            {
                borrow = false;
                c--;
                if (c < m_Alphabet[0])
                {
                    c = m_Alphabet[m_Alphabet.Length - 1];
                    borrow = true;
                }
                return c;
            }
            
            private int IncrementMiddle()
            {
                int pos = Middle.Length - 1;
                while (pos > 0)
                {
                    Middle[pos] = IncrementChar(Middle[pos], out bool carry);
                    if (!carry) return 0;
                    pos--;
                }
                return 1;
            }
    
            private int DecrementMiddle()
            {
                int pos = Middle.Length - 1;
                while (pos > 0)
                {
                    Middle[pos] = DecrementChar(Middle[pos], out bool borrow);
                    if (!borrow) return 0;
                    pos--;
                }
                return 1;
            }
    
            public void Increment()
            {
                if (IncrementLast() > 0)
                {
                    if (IncrementMiddle() > 0) First++;
                }
            }
    
            public void Decrement()
            {
                if (DecrementLast() > 0)
                {
                    if (DecrementMiddle() > 0) First--;
                }
            }
        }
    Ответ написан
  • Как сохранить значения переменных после перезапуска в C#?

    @cicatrix
    было бы большой ошибкой думать
    Ответ написан
    Комментировать
  • Как реализовать движение рисунка С#?

    @cicatrix
    было бы большой ошибкой думать
    А что именно не работает-то?
    Методы исполняются синхронно, и пока весь цикл не закончится, картинка отображаться не будет... вернее, может и будет, но по желанию операционной системы.
    В тело цикла добавь Application.DoEvents(). В целом, криво, но для лабы сойдёт. Особенно, для такой, где анимацию в Windows Forms заставляют делать.
    Ответ написан
    Комментировать
  • Как извлечь подтег из главного тега?

    @cicatrix
    было бы большой ошибкой думать
    Комментировать
  • Реализация отложенных задач на локальном сервере?

    @cicatrix
    было бы большой ошибкой думать
    Task Sheduler и Cron, но я так понимаю им всем нужно подключение к интернету

    Откуда этот бред? Может быть ознакомились бы для начала с их документацией?

    Cron или Task Sheduler - именно то, что нужно, если нужно просто и быстро.
    Ответ написан
    Комментировать
  • Как определить метод шифрования?

    @cicatrix
    было бы большой ошибкой думать
    То, что вы спрашиваете, называется криптоанализ. Если я правильно понял задачу - вы работаете с "чёрным ящиком" сам алгоритм кодирования известен устройствам, но неизвестен вам.
    Наверное, какой-нибудь опытный криптоаналитик и смог бы вам помочь с весьма призрачными шансами на успех.
    Вернее так, шансы на успех зависят от алгоритма шифрования, которые изначально проектируются умными людьми специально, чтобы максимально осложнить вот это то, чем вы занимаетесь.
    Например, проверьте, кодируется ли одно и то же входящее сообщение каждый раз по-разному или одинаково. Если по-разному, то в алгоритме используется какой-то неизвестным вам параметр (вектор инициализации), и это может быть что угодно (например, внутренняя таблица подстановки). А если устройства могут использовать какие-либо другие данные, то задача усложняется многократно. Тут надо будет уже понимать, откуда эти векторы инициализации могут браться в принципе.
    А так-то сбрутфорсить 4 байта - задачка плёвая, но алгоритм, естественно, вы так не найдёте. Да и ещё вопрос - каждый раз ключ разный или одинаковый?
    Ну а лучше всего, раскопать документацию по этим двум устройствам, ну или расковырять и проверять уже саму электронику. Если есть чипы с памятью, то выпаять - считать память, покурить даташиты, посмотреть, что происходит. Если это не пульт управления ядерным оружием, то не думаю, что с защитой уж слишком сильно заморачивались. Вполне можно попробовать перехватить сигнал на открытие доступа и сделать обход.

    P.S. А вы вообще уверены, что это шифрование? Может, сигналы управляющие какие-нибудь?
    4 байта - уж больно примитивная защита.
    Ответ написан
    9 комментариев
  • Как сделать анимацию на XAML?

    @cicatrix
    было бы большой ошибкой думать
    Вы про это?
    Easing functions
    Ответ написан
    Комментировать
  • Как увеличить разрешение .EPS файла на С# Windows Forms и сохранить его?

    @cicatrix
    было бы большой ошибкой думать
    EPS векторный формат. О каком разрешении идёт речь? Он масштабируется как хочешь.
    Ответ написан
  • Как накидать логику работы будущей программы?

    @cicatrix
    было бы большой ошибкой думать
    Начинается всё на листке бумаги. Если проектируешь один, то никаких формальных схем описания придерживаться не нужно. Просто так, чтобы самому было понятно, что и как.

    Подхода два - от интерфейса к логике или наоборот - от логики к интерфейсу. Что лучше, что хуже - вкусовщина. От интерфейса к логике получается немного более по "KISS-овски" и "YAGNI-вски", так как накидываешь только те фичи, которые хочешь реализовать. От логики к интерфейсу работать тоже можно, но тут есть риск уйти в преждевременную оптимизацию.

    Дальше логика разбивается на блоки задач и модели данных. К моделям определяешь, какие действия с ними надо будет совершать - так определяются методы. Здесь же определяешь сигнатуры этих методов (параметры, их типы, возвращаемые значения). Если проект крупный - то тут уже неплохо было бы UML схемку набросать.

    После того, как определил иерархию классов, можно уже запускать IDE и сразу создать определения всех классов которые ты нарисовал на бумаге. В каждом классе рисуешь заглушки методов (можно сразу помечать комментарием TODO, чтобы ничего не опустить).

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

    Ну вот уже после всего этого, начинай писать код. Тебе будет легко и приятно. Ты будешь примерно представлять, сколько ты уже сделал, и сколько ещё осталось. Баги будут вылавливаться тестами, и ты не будешь писать лишний код, которым никто не будет пользоваться в дальнейшем.
    Ответ написан
    1 комментарий
  • Что почитать? Чтобы для себя паять устройства, для автоматики в быту, на микроконтроллерах и реле?

    @cicatrix
    было бы большой ошибкой думать
    Если дружите с англ. языком, есть на Youtube замечательный канал пользователя Ben Eater (его сайт, его канал).
    Объясняет всё настолько наглядно и по делу, при этом и теорию и практику, причём, на конкретных примерах, что после просмотра аж руки зудят взять в руки макетную плату или паяльник.
    Не знаю, может стоит и переводы поискать.
    Ответ написан
    Комментировать
  • Кто несет ответственность за нелицензионное ПО на арендованном сервере?

    @cicatrix
    было бы большой ошибкой думать
    Юридические вопросы, к сожалению, не решаются вот так, жёсткими определениями. Достаточность или недостаточность определяется конкретным судьёй на конкретном заседании по конкретному вопросу.
    И очень много переменных - кто наехал, с каким обвинением, есть ли гос. интерес, какой адвокат, болит ли голова у судьи, нравится ли ему ваша физиономия, и пр.
    Многие недолюбливают юристов, потому что считают, что те высасывают проблемы из пальца, однако, они руководствуются принципом, лучше перестраховаться, чем потом огребать по искам.
    Я к чему - внести в пользовательское соглашение конкретные формулировки, что ответственность за контрафактное ПО, детскую порнографию и призывы освободить Навального на жёстких дисках лежит исключительно на ваших добропорядочных клиентах, вам ничего не стоит, однако на гипотетическом судебном разбирательстве будет однозначно трактоваться в вашу пользу.
    Ответ написан
    21 комментарий
  • Как создать методы контроллера для создания сущностей 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 комментария