Ответы пользователя по тегу Программирование
  • Как перестать комментировать всё подряд?

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

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

    @cicatrix
    было бы большой ошибкой думать
    Я бы посоветовал вообще разделить функционал и GUI.
    Весь функционал обернул бы в class library (dll), а gui уже потом просто дописал бы к этой либе.
    А писать - да, на чём угодно.
    Если XP, то C# + WinForms.
    Без XP можно WPF (с ним удобно реализовать это):
    Немного нестандартный GUI, в частности нужны ListBox'ы с иконками и чекбоксами.

    На винформах тоже можно, но трудозатрат побольше.

    Ну и экзотический вариант (но не без шарма) - сделать гуй на html + css, а само приложение может реализовывать простейший веб-сервер (ну отдать по запросу html-файлик get-ом и принять инфу post-ом) - зато вообще практически без платформенных зависимостей.
    Ответ написан
    Комментировать
  • Почему никак не узнать исходный код игры?

    @cicatrix
    было бы большой ошибкой думать
    Справедливости ради стоит отметить, что много современных игр состоят из 2 основных частей.
    Первая - это т. н. "движок", он отвечает за визуализацию моделей, обработку ввода, сеть, просчёт физики и пр. Он действительно обычно скомпилирован в машинный код и его дизассемблирование очень затруднено.
    Вторая часть - это игровая логика, она уже отвечает за сценарий, определяет, что произойдёт в игре на определённые действия игрока, открывает уровни, изменяет параметры самой игры, и пр.
    Очень часто, игровая логика описывается скриптами, которые доступны для чтения.
    Разумеется, это не всегда так, но очень часто игровые студии не имеют ресурсов или желания для разработки собственного движка, а сосредотачиваются на самой игре.
    Огромное количнство игр, даже ААА сделаны именно так. Думаю, движки Unity и UnrealEngine в совокупности отжирают более половины мирового рынка игр.
    Ответ написан
    Комментировать
  • DRY любой ценой?

    @cicatrix
    было бы большой ошибкой думать
    Слепое и бездумное следование чему бы то ни было - плохо.
    Конкретно в вашем примере (исключиительно с того, как описана проблема), соблюсти принцип DRY и, в то же время придерживаться KISS и не делать god object можно цепочкой наследования от простых форм к сложным.
    Ответ написан
    Комментировать
  • Таймер и линейность?

    @cicatrix
    было бы большой ошибкой думать
    В дополнение скажу, что ещё многое зависит от типа операционной системы, в которой работает программа. Скажем, есть класс систем, которые называются "системы реального времени". Такие ОС как, например, Linux или Windows такими системами не являются, и получить гарантированный отклик в заданный промежуток времени на них не получится. поэтому в промышленности, на чувствительных к времени отклика объектах (на ум приходит ядерный реактор, например, система управления самолётом, и т. д.) такие системы использовать нельзя.
    В общем случае, ОС запускает программу и передаёт управление ей, программа думает, что она такая у ОС одна, но это не так. В произвольный момент времени, ОС может прервать работу программы и передать управление второй программе, третьей, и т. д. Если ядер несколько, то ОС сама контролирует какой поток какой из программ на каком ядре будет исполняться. Или же, получив сигнал с оборудования (с клавиатуры или мыши, например), посылает соответствующее сообщение в программы, которые "подписаны" на такие события.
    Выше (или ниже - с какой стороны посмотреть) ОС работает BIOS (базовая система ввода-вывода) или приходящий ему на смену UEFI. Ещё "выше" или "ниже" - микрокод на "железе".
    Ответ написан
    Комментировать
  • Английский для программиста или на что лучше ставку сделать?

    @cicatrix
    было бы большой ошибкой думать
    Одно другое дополняет. В своё время мне изучение программирование и необходимость копаться в документации здорово помогло с английским и наоборот, изучение английского неплохо способствует при изучении программирования.
    На курсы ходить имеет смысл только, если с самодисциплиной есть проблемы. Так как должное произношение вам, в принципе, не требуется, начните с первой 1000 самых распространённых слов. 1000 наиболее часто встречающихся слов практически в любом языке покрывает 60%-70% всех потребностей, а выучить их можно за неделю. 5000 слов перекрывают 85-90% слов. Да, общаться вы без знания грамматики, наверное, не сможете, но читать мануалы - легко.
    Дальше уже ваше дело - продолжать изучать язык по-нормальному, либо довольствоваться "глоссарием программиста".
    Ответ написан
    Комментировать
  • Как сделать, чтобы в WinAPI stdout перенаправлялся, а stderr уходил в никуда?

    @cicatrix
    было бы большой ошибкой думать
    Язык какой?
    На C# это гораздо проще делается, без Win32API вообще.
    На плюсах смотрим структуру STARTUPINFO
    typedef struct _STARTUPINFO {
      DWORD  cb;
      LPTSTR lpReserved;
      LPTSTR lpDesktop;
      LPTSTR lpTitle;
      DWORD  dwX;
      DWORD  dwY;
      DWORD  dwXSize;
      DWORD  dwYSize;
      DWORD  dwXCountChars;
      DWORD  dwYCountChars;
      DWORD  dwFillAttribute;
      DWORD  dwFlags;
      WORD   wShowWindow;
      WORD   cbReserved2;
      LPBYTE lpReserved2;
      HANDLE hStdInput;
      HANDLE hStdOutput;
      HANDLE hStdError;
    } STARTUPINFO, *LPSTARTUPINFO;

    В dwFlags обязательно устанавливаем STARTF_USESTDHANDLES
    После вызова CreateProcess в hStdInput, hStdOutput и hStdError получают указатели на соответствующие потоки.
    Ответ написан
    Комментировать
  • Где взять практику программисту?

    @cicatrix
    было бы большой ошибкой думать
    Велосипеды.
    Есть редактор Notepad++ - начинался как велосипед (замена обычному блокноту) - теперь мощный и классный инструмент.
    Вот есть граф. редактор Paint.Net. Начинался как велосипед (то ли курсовая, то ли дипломная работа чья-то) по замене MS Paint. Сейчас - вполне успешный и даже, наверное, прибыльный проект.
    Вот есть операционная система Linux, начиналась... ну вы поняли :)
    Ответ написан
    Комментировать
  • Как правильно распределить обязанности по веб разработки?

    @cicatrix
    было бы большой ошибкой думать
    Позволю себе дать вам более абстрактный совет: не ведите общего бизнеса с друзьями, не берите у них в долг и не одалживайте сами. Это самый верный способ потерять друга.

    Рано или поздно вам придётся делать выбор между дружбой и профессионализмом. Если хотите работать в команде, ищите единомышленников-профессионалов.
    Ответ написан
    1 комментарий
  • Как определиться с деятельностью?

    @cicatrix
    было бы большой ошибкой думать
    Вариант - не заниматься программированием, коль не понравилось. Есть полно других достойных профессий.
    Ответ написан
    7 комментариев
  • Выбор ЯП для обработки изображений?

    @cicatrix
    было бы большой ошибкой думать
    Для изображений потребуется быстродействие, особенно, если их много.
    Если ещё и попиксельная обработка, то я бы порекомендовал C или C++ - там, работая с указателями, можно очень быстро манипулировать памятью, в которой отображается растр.
    Если скорость исполнения/обработки не критична, то см. предыдущий ответ - любой язык подойдёт.
    Я бы даже дополнил, что на C/C++ следует написать только саму процедуру обработки, а интерфейс и прочее можно в чём угодно.
    Ответ написан
    Комментировать
  • Как правильно называть массивы?

    @cicatrix
    было бы большой ошибкой думать
    Для проекта принимается naming convention. Собственно, это условности, но в больших проектах это имеет значение.
    Видел, использование префиксов: aOrders, arrOrders; как суффикс: OrdersArray, но в целом, множественное число кажется гораздо логичнее.
    Вообще, надо ориентироваться на naming convention, принятый в стандартных библиотеках языка, на котором пишется код, то есть, посмотреть на стиль наименований, которые приняли разработчики языка (собственно, это касается не только наименований массивов - между лаконичностью питона и МногокилометровымиНазваниямиКлассовНаСиШарп всё-таки разница в стиле заметна).
    Ответ написан
    Комментировать
  • Как писать приложения с нестандартным интерфейсом WindowsForms?

    @cicatrix
    было бы большой ошибкой думать
    Даже на "голом" Windows Forms можно тупо "рисовать" любые элементы управления. Стандартную библиотеки придуманы просто для облегчения данного процесса программистам. В принципе, вам ничего не мешает отрисовывать в окне вообще всё. В целом, это даже не так сложно, как кажется.
    В конце концов, и Windows Forms, и WPF базируются на Win32API.
    Используя стандартные элементы управления (кнопки, текстбоксы, и пр.) даже при простой кастомизации свойств можно добиться весьма неплохих реультатов. Если кажется, что этого мало, возможно, вы просто ещё не всё попробовали. Если же действительно мало, то есть прямые вызовы функций Windows API. Тут вообще можно делать с окном что угодно.
    Ответ написан
    Комментировать
  • Что происходит с комментариями после компиляции?

    @cicatrix
    было бы большой ошибкой думать
    Хорошие комментарии попадают в рай, плохие - в ад.
    Ответ написан
    2 комментария
  • Как распределять потоки при асинхронном программировании?

    @cicatrix
    было бы большой ошибкой думать
    То, что вы описываете, весьма подходит под классический producer/consumer pattern (производитель/потребитель) Почему-то находится мало источников на русском языке, но англоязычных - полно.
    Есть и готовые реализации данного шаблона.

    Да, и вовсе не обязательно ограничивать количество потоков количеством ядер. Вы вполне можете использовать большее количество потоков, советую поэкспериментировать с количеством, замеряя скорости исполнения, пока не добьётесь оптимального результата.
    Ответ написан
  • Как создать такую форму на C# (не WPF) (перенос из DevelNext)?

    @cicatrix
    было бы большой ошибкой думать
    А в чём проблема? Вот, набросал за пару минут:
    ozHaspD.png

    Код из Form1.Designer.cs
    namespace FormLoginDemo
    {
        partial class Form1
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Windows Form Designer generated code
    
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.txtLogin = new System.Windows.Forms.TextBox();
                this.label1 = new System.Windows.Forms.Label();
                this.label2 = new System.Windows.Forms.Label();
                this.txtPassword = new System.Windows.Forms.TextBox();
                this.button1 = new System.Windows.Forms.Button();
                this.label3 = new System.Windows.Forms.Label();
                this.lnkReg = new System.Windows.Forms.LinkLabel();
                this.SuspendLayout();
                // 
                // txtLogin
                // 
                this.txtLogin.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                this.txtLogin.Font = new System.Drawing.Font("Arial", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.txtLogin.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
                this.txtLogin.Location = new System.Drawing.Point(71, 97);
                this.txtLogin.Margin = new System.Windows.Forms.Padding(6);
                this.txtLogin.Name = "txtLogin";
                this.txtLogin.Size = new System.Drawing.Size(298, 35);
                this.txtLogin.TabIndex = 0;
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
                this.label1.Location = new System.Drawing.Point(67, 71);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(59, 20);
                this.label1.TabIndex = 1;
                this.label1.Text = "Логин:";
                // 
                // label2
                // 
                this.label2.AutoSize = true;
                this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
                this.label2.Location = new System.Drawing.Point(67, 143);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(71, 20);
                this.label2.TabIndex = 3;
                this.label2.Text = "Пароль:";
                // 
                // txtPassword
                // 
                this.txtPassword.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                this.txtPassword.Font = new System.Drawing.Font("Arial", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.txtPassword.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
                this.txtPassword.Location = new System.Drawing.Point(71, 169);
                this.txtPassword.Margin = new System.Windows.Forms.Padding(6);
                this.txtPassword.Name = "txtPassword";
                this.txtPassword.PasswordChar = '•';
                this.txtPassword.Size = new System.Drawing.Size(298, 35);
                this.txtPassword.TabIndex = 2;
                // 
                // button1
                // 
                this.button1.BackColor = System.Drawing.Color.Black;
                this.button1.FlatAppearance.BorderColor = System.Drawing.Color.DimGray;
                this.button1.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray;
                this.button1.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
                this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                this.button1.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.button1.ForeColor = System.Drawing.Color.White;
                this.button1.Location = new System.Drawing.Point(71, 233);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(130, 45);
                this.button1.TabIndex = 4;
                this.button1.Text = "Войти";
                this.button1.UseVisualStyleBackColor = false;
                // 
                // label3
                // 
                this.label3.AutoSize = true;
                this.label3.Font = new System.Drawing.Font("Arial", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
                this.label3.Location = new System.Drawing.Point(29, 25);
                this.label3.Name = "label3";
                this.label3.Size = new System.Drawing.Size(198, 27);
                this.label3.TabIndex = 5;
                this.label3.Text = "Авторизация ^_^";
                // 
                // lnkReg
                // 
                this.lnkReg.ActiveLinkColor = System.Drawing.Color.CornflowerBlue;
                this.lnkReg.AutoSize = true;
                this.lnkReg.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
                this.lnkReg.ForeColor = System.Drawing.Color.CornflowerBlue;
                this.lnkReg.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
                this.lnkReg.LinkColor = System.Drawing.Color.CornflowerBlue;
                this.lnkReg.Location = new System.Drawing.Point(240, 246);
                this.lnkReg.Name = "lnkReg";
                this.lnkReg.Size = new System.Drawing.Size(100, 18);
                this.lnkReg.TabIndex = 6;
                this.lnkReg.TabStop = true;
                this.lnkReg.Text = "Регистрация";
                this.lnkReg.VisitedLinkColor = System.Drawing.Color.CornflowerBlue;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.BackColor = System.Drawing.Color.White;
                this.ClientSize = new System.Drawing.Size(562, 374);
                this.ControlBox = false;
                this.Controls.Add(this.lnkReg);
                this.Controls.Add(this.label3);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.txtPassword);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.txtLogin);
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                this.Name = "Form1";
                this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
    
            #endregion
    
            private System.Windows.Forms.TextBox txtLogin;
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.Label label2;
            private System.Windows.Forms.TextBox txtPassword;
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.Label label3;
            private System.Windows.Forms.LinkLabel lnkReg;
        }
    }
    Ответ написан
    Комментировать
  • Перебор 0 и 1 в си?

    @cicatrix
    было бы большой ошибкой думать
    Вводим n
    Запускаем цикл i от 0 до 2n - 1
    В цикле каждое i выводим в двоичном представлении.
    Ответ написан
    Комментировать
  • Как использовать блокчейн технологии в своих проектах?

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

    @cicatrix
    было бы большой ошибкой думать
    Сениор - это человек с огромным практическим опытом наступания на грабли и изобретания/модернизации "велосипедов".
    Нельзя что-то прочитать и стать сениором.
    Ответ написан