Задать вопрос
  • Есть ли в VSC какое-нибудь расширение, которое может удалять межстрочные пробелы?

    Collin
    @Collin
    Вам нужен линтер и инструмент для форматирования кода. Например для JS есть отличный линтер -- ESLint JavaScript into VS Code., а для общего форматирования Prettier - Code formatter

    И линтер и инструменты форматирования гибко настраиваются. Почитайте описания у расширений, там все описано как и что.
    Ответ написан
    2 комментария
  • Сколько места на диске для создания локального репозитория?

    Collin
    @Collin
    135+ гб потребуется для репозитория:
    deb http://ua.archive.ubuntu.com/ubuntu/ focal main restricted


    Но нужно иметь примерно 150+ гб, если вы настроите cron на ежесуточное обновление своего локального зеркала.
    Ответ написан
    Комментировать
  • Почему не работает команда в терминале Ubuntu?

    Collin
    @Collin
    Скопируйте:
    tar -xf Python-3.9.5.tgz

    Бездумно копировать и вставлять в терминал не стоит, если вы не пользуетесь тайм-машиной для бекапов)

    Для справки, если что-то у вас не получается, существует утилита man

    Вы всегда можете сделать man tar и прочитать полную справку по утилите.
    Ответ написан
    1 комментарий
  • Сложен ли переход с python на c#?

    Collin
    @Collin
    Если вы хорошо освоили принципы объектного программирования, поняли, что такое ООП, знаете основные конструкции общие для всех языков -- совсем не сложно.

    Для вас изменится синтаксис (к примеру циклов for и прч базовых штук), но смысл останется тем же. Плюс C# строго типизированный язык, добро пожаловать в адекватное и комфортное программирование.
    Справка по языку на русском даже есть полноценная, на том же msdn. Среда разработки очень удобная.

    Тут вопрос больше не в сложности перехода (потому что изучить новый язык, имея опыт -- не сложно), а вопрос инструментария. Для каких целей и задач вы рассматриваете переход на .net framework (.net core); так ли вам нужна эта замена Python; решит ли конкретно ваши задачи этот переход.

    Если уж куда и переходить с Python, то на C, что бы писать более производительный код и оборачивать его в Python код. А так, при переходе с Python на C# вы перейдете с высокоуровневого языка на высокоуровневый. Масло маслянное.
    Ответ написан
    Комментировать
  • Как установить MacOS на ноутбуке HP Pavilion Power 15?

    Collin
    @Collin
    Это вопрос из серии: как собрать большой самолёт из самолёта поменьше, сборку планирую на соседнем аэродроме, полная характеристика самолёта-поменьше здесь: http://полезная_информация.рф.

    На самом деле здесь не все так просто и нужно определиться с целью. Если целью является установка OSX для того, что бы использовать на нём x-code, то это крайне бессмысленная затея, так как вы не сможете получить dev-id с hackintosh.

    Если просто поиграться, то вам нужно найти под всё своё железо драйверы, так называемые KEXT (ну, например тут), погуглить, что такое загрузчик clover, раздобыть образ mac osx на любом удобном [censure]-треккере, следуя приложенным инструкция накатить образ на флешку и пойти устанавливать, молясь, что бы не было паники ядра и лупов.

    Ну и в конце концов вообще такие вещи сначала тщательно гуглят, вот, пока я хотел вам выдать ссылку на clover, первая же статья в списке с habr. Статья не особо раскрывает смысл, но стоит заглянуть в комментарии, там вы найдете много интересных ссылок.
    Ответ написан
    Комментировать
  • Как сохранять данные приложения?

    Collin
    @Collin
    Есть несколько способов хранить пользовательскую информацию, но все способы реализации сводятся к одному -- сохранять информацию в я xml или json файл, т.е. файлы, которые можно сериализировать.

    1. Использовать файл Settings.settings в Properties:
    • Дважды кликайте по Settings.settings
    • Добавляете нужные свойства ( к примеру name), не забывая при этом выбрать тип (для примера string)
    • В коде в using добавляете using yourNameSpace.Properties;
    • В самом коде для чтения из Settings.settings используете string name = Settings.Default["name"].ToString();
    • Для сохранения изменений Settings.Default["name"] = name;, затем Settings.Default.Save();


    2. Использовать XML файл -- эту информацию можно поискать в интернете, а именно для реализации этого способа вам нужно погуглить некоторую информация, методы и классы, которые вам помогут, а именно:
    • Application.StartupPath
    • XmlWriter
    • DataSet
    • DataSet.ReadXml(filePath)
    • Сериализация xml

    Кода будеть чуть больше, но зато вы поймёте механизм работы.

    3. Использовать сохранение в реестр. Здесь подсказывать ничего не буду, для начала стоит освоить первые два пункта.

    Сохранять пользовательскую информацию приложения в базу данных я не вижу смысла (если только не в этом суть приложения), так что предлагать вариант, мол, хранить всё в SQLight или вообще в mssql/any-sql-setver я не стал бы.
    Ответ написан
    1 комментарий
  • Почему Mint не загружается после загрузки убунту с флешки?

    Collin
    @Collin
    Если не решите проблемы советами выше, то попробуйте восстановить grub boot-repair`ом, для этого снова загрузитесь с флешки, откройте терминал, добавьте ppa репозиторий и установите boot-repair:
    sudo add-apt-repository ppa:yannubuntu/boot-repair
    sudo apt update
    sudo apt install -y boot-repair && boot-repair

    После в boot-repair нажать Advanced, в 3-й вкладке поставить птичку на PURE, следовать указаниям boot-repair`а.

    Небольшая справка по boot-repair
    Ответ написан
    Комментировать
  • Поставить mint и использовать в полной мере как ubuntu?

    Collin
    @Collin
    Я посоветовал бы поставить Ubuntu и воткнуть туда LXQT или XFCE. Они очень легкие и достаточно легко настраиваются.

    Вообще выбор DE огромный, просто нужно выбрать тот, который подходит вам. Вот краткий список, который вы можете погуглить:
    • Cinnamon
    • LXDE (LXQt)
    • XFCE
    • Pantheon
    • KDE
    • Gnome
    • Mate


    Так же вы можете использовать просто менеджер окон, Openbox и тд.

    Вам лучше погуглить тег *nix porn и посмотреть, что вам нравится больше.

    Это может выглядеть вот так:
    d-OjYv3TGOA.jpg
    krzGaqXA6do.jpg
    iZspEzsIIuU.jpg
    Ответ написан
    Комментировать
  • Ubuntu не находит установленный wine. Как прописать путь к wine?

    Collin
    @Collin
    Удалить Wine через apt autoremove и apt purge, и установить как положено.

    Почитать на офф сайте И обязательно вот тут

    Для 20.04:

    sudo dpkg --add-architecture i386
    wget -O - https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add -
    sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'
    sudo apt update
    
    sudo apt install --install-recommends winehq-stable
    sudo apt install wine winetricks
    sudo apt install wine32
    Ответ написан
    Комментировать
  • Csc.exe не видит другие классы?

    Collin
    @Collin
    Вы делаете вот так:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe C:\Users\user\Documents\Projects\proj\main.cs


    А надо вот так:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe C:\Users\user\Documents\Projects\proj\*.cs


    *.cs, где * - все файлы с расширением .cs

    А вообще лучше всего сначала перейти в директорию, где лежит ваш компилятор, что бы было его удобнее использовать, это стандартная команда cd <your_path>, и выглядело бы это все примерно так:
    cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
    csc.exe C:\Users\user\Documents\Projects\proj\*.cs


    Это просто удобнее использовать.
    И ознакомьтесь с cmd/powerhell/terminal хотя бы базово. Узнайте, как использовать такие команды, как:
    cd ./path
    ls ./path 
    cp ./path ./path
    mv ./path ./path
    mkdir <dir_name> 
    > filename.anyext
    Ответ написан
    Комментировать
  • Стоит ли использовать здесь перечисления?

    Collin
    @Collin
    Стоит, так будет удобнее и понятнее.
    namespace TryEnum
    {
        enum DownloadType
        {
            Video, Audio, Custom, Unknown, Default
        }
        enum ForceIpProtocol
        {
            IPv4, IPv6
        }
        enum ProxyProtocol
        {
            HTTPS, HTTP, SOCKS4, SOCKS5
        }
    }


    А использовать вот так:
    5ed7670d68591771166057.png

    А по поводу интерфейсов... Интерфейсы не должны быть вместо классов; класс реализует интерфейс (выглядит синтаксис как наследование class ClassName : IClassName, но это не совсем наследование, там немножко другая реализация). И интерфейс нужен в том случае, если нужно реализовать полиморфизм в коде и/или что бы упростить доступ к публичным полям в классах, которые реализуют этот интерфейс.
    Например: у нас есть много классов с разными реализациями, но их всех объединяют одни и те же свойства (к приеру свойства public string Name ( get; set; ); public int Age( get; set; ); и тд...). Интерфейс в данном случае нужен для того, что бы через него мы получали доступ ко множественному поведению, при помощи разных классов, содержащих одноименные свойства, не плодя при этом код.

    Для наглядности:

    у нас есть метод Create(); в котором мы хотим создавать новых людей

    static void Create()
            {
                // empty...
            }


    Есть разные классы, которые создают Human и реализуют интерфейс IHuman

    class SimpleHuman : IHuman
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public SimpleHuman()
            {
                Name = "Generic human...";
                Age = 20;
            }
            public SimpleHuman(string name) : this()
            {
                Name = name;
            }
            public SimpleHuman(string name, int age) : this()
            {
                Name = name;
                Age = age;
            }
        }


    class CoolHuman : IHuman
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public CoolHuman()
            {
                Name = "BOB!";
                Age = 20;
            }
            public CoolHuman(string name) : this()
            {
                Name = name;
            }
            public CoolHuman(string name, int age) : this()
            {
                Name = name;
                Age = age;
            }
        }


    interface IHuman
        {
            string Name { get; set; }
            int Age { get; set; }
        }


    И теперь, благодаря реализации интерфейса в этих классах мы можем удобно использовать этот самый интерфейс, например:
    class Create
        {
            public IHuman Human { get; set; }
            public Create()
            {
                Human = new CoolHuman();
            }
            public void Hello()
            {
                Console.WriteLine("Hello, {0}. Today you are {1} years old", Human.Name, Human.Age);
            }
        }


    Конкретно в вашем случае интерфес не нужен.
    Ответ написан
    4 комментария
  • Kак заполнить datagrid из datatable?

    Collin
    @Collin
    Удалить свои колонки

    В коде потом настроить отображение, вроде:

    dataGridView1.Columns[0].HeaderText = "№";
    dataGridView1.Columns[0].MinimumWidth = 25;
    dataGridView1.Columns[0].Width = 40;
    dataGridView1.Columns[0].Visible = true;
    
    dataGridView1.Columns[1].HeaderText = "Спрятанная колонка";
    dataGridView1.Columns[1].Visible = false;
    Ответ написан
    4 комментария
  • Кк убрать readonly со строки C#?

    Collin
    @Collin
    dataGridView1.Columns[0].ReadOnly = false;
    Ответ написан
    Комментировать
  • Как поменять элементы массива местами?

    Collin
    @Collin
    Вы описали алгоритм сортировки пузырьком.

    Его реализация:

    int[] array = new[] { 1, 2, 3, 4, 5 };
    int temp;
                for (int i = 0; i < array.Length-1; i++)
                {
                    for (int j = i + 1; j < array.Length; j++)
                    {
                        if (array[i] > array[j])
                        {
                            temp = array[i];
                            array[i] = array[j];
                            array[j] = temp;
                        }
                    }
                }


    Теперь просто примените этот алгоритм к своей конкретной задаче.
    Ответ написан
    4 комментария
  • Как удалить всё, кроме букв?

    Collin
    @Collin
    Ответ написан
    Комментировать
  • Как создать счетчик запуска программ внутри самой программе(внутри поля класса)?

    Collin
    @Collin
    Можно использовать свойство, которое будет сохранять ваше значение в Settings.settings

    1. Создаем параметр и значение в Settings.settings
    5eba43ef4737a482179842.png
    2. Создадим класс, для удобства -- статический, импортируем using yourNamespace.Properties;, что бы можно было использовать Settings.Default и заведем там свойство:

    public static int Count
            {
                get
                {
                    return (int)(Settings.Default["count"]);
                }
                set
                {
                    Settings.Default["count"] = value;
                    Settings.Default.Save();
                }
            }


    теперь где угодно в коде мы можем выполнить

    YourStaticClass.Count = ++YourStaticClass.Count;

    Важно: не использовать увеличение Count до InitializeComponent(), если это формы или WPF. Получите ошибку.
    Ответ написан
    2 комментария
  • Как из string добавить в datagridView?

    Collin
    @Collin
    Тут зависит от того, как именно вы используете грид. Желательно выкладывать фрагмент кода.

    Обычно с гридом используют DataSource, к примеру биндят в него dataSet, который содержит в себе Tables.

    Выглядит это так:

    dataGridView1.DataSource = dataSet.Tables[0];
    (на месте "0" может быть и "Название таблицы")

    В таком случае нам потребуется добавлять строку в таблицу Tables[0]

    dataSet.Tables[0].Rows.Add(); 
    dataSet.Tables[0].Rows[dataSet.Tables[0].Rows.Count - 1][int номер ячейки, куда добавить string] = receivedData;

    Здесь нужно пояснить, что строки и ячейки в dataSet.Tables индексируются как
    .Rows[int индекс строки][int индекс столбца/ячейки (Cells)]
    , и для того, что бы узнать, какая наша строка добавилась (а добавилась она в конец), мы, узнав количество Rows.Count строк, вычитаем из Count 1, т.к. индексирование в списках, массивах и т.д. начинается с 0, а в Count не может быть 0, если есть хоть одна строка, то Count уже будет равен 1.

    Может потребоваться обновление грида:
    dataGridView1.Update();
    Ответ написан
    Комментировать
  • Ошибка при добавлении новой строки с таким же названием?

    Collin
    @Collin
    Загружаем данные:
    Предварительно заведем два глобальных поля (можно и лучше это делать через свойство, но сделаем попроще)
    DataSet dataSet = new DataSet();
    string filePath = Application.StartupPath + "\\dataset.xml";


    private void Form1_Shown(object sender, EventArgs e)
    {
    	// Проверяем наличие файла, если на месте, то загружаем из него наш dataSet
    	if (File.Exists(filePath))
    	{
    		dataSet.ReadXml(filePath);
    	}
    	// Если отсутствует, создадим файл с простой структурой для 1 строки
        else
    	{
    		using (XmlWriter writer = XmlWriter.Create("dataset.xml"))
    		{
                writer.WriteStartElement("Data");
                writer.WriteStartElement("rows");
                writer.WriteElementString("Type", "");
                writer.WriteElementString("Category", "");
                writer.WriteElementString("Date", "" + DateTime.Now.ToString("dd.mm.yyy") + "");
                writer.WriteElementString("Summ", "0");
                writer.WriteElementString("Total", "0");
                writer.WriteElementString("Comment", "");
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.Flush();
    		}
    	}
    	// Заполняем датагрид
    	DataGridFill(dataSet);
    	//Подписываемся на событие добавление новой строки
    	dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);
    }


    В случае, если у нас отсутствовал файл, программа создаст файл с 1 строкой с такой структурой:
    <?xml version="1.0" standalone="yes"?>
    <Data>
      <rows>
        <Type />
        <Category />
        <Date>06.03.2020</Date>
        <Summ>0</Summ>
        <Total>0</Total>
        <Comment />
      </rows>
    </Data>


    Далее, метод добавления новой строки:
    Можем сделать не очень клёво и добавлять пустую строчку сразу в грид:
    private void Add_button_Click(object sender, EventArgs e)
    {
    	string empty = "";
    	string date = DateTime.Now.ToString("dd.mm.yyyy");
    
    	if (dataGridView1.Columns.Count != 0)
    	{
    		dataSet.Tables[0].Rows.Add(new object[] { empty, empty, date, empty, empty, empty });
    		dataGridView1.Update();
    	}
    	else
    		MessageBox.Show("Ошибка: Невозможно добавить строку в таблицу, в которой отсутствуют колонки",
    						"Ошибка",
    						MessageBoxButtons.OK,
    						MessageBoxIcon.Error);
    }


    А можем сделать удобнее, и вызвать окно, где введем/выберем нужные нам данные.

    Считать сумму можно как и при запуске, бегая циклом, так и при отрабатывании ивента dataGridView1.RowsAdded, на который мы подписались после заполнения грида:
    dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);


    Например -- при запуске я немного форматирую грид и делаю такую штуку:

    private void DataGridFill(DataSet dataSet)
    {
    	if (dataSet != null)
    	{
            dataGridView1.DataSource = dataSet.Tables[0];
    		
    		for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    		{
    			if (string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][4].ToString()))
                ataSet.Tables[0].Rows[i][4] = 0;
            }
    
    		for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    		{
    			if (i != 0 && !string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
    				dataSet.Tables[0].Rows[i][4] = Convert.ToDouble(dataSet.Tables[0].Rows[i - 1][4]) + Convert.ToDouble(dataSet.Tables[0].Rows[i][3]);
          else if (!string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
            dataSet.Tables[0].Rows[i][4] = dataSet.Tables[0].Rows[i][3];
    		}
        }
    
        dataGridView1.Columns[0].HeaderText = "Тип";
        dataGridView1.Columns[1].HeaderText = "Категория";
        dataGridView1.Columns[2].HeaderText = "Дата";
        dataGridView1.Columns[3].HeaderText = "Сумма";
        dataGridView1.Columns[4].HeaderText = "Итого";
        dataGridView1.Columns[5].HeaderText = "Комментарий";
    }


    Но это считает строго сумму, не учитывая тега расход/доход. Что бы учитывало, нужно проверять ячейку с типом и опираясь на это уже производить математические операции.
    Ответ написан
    Комментировать
  • Как обратиться ко всем элементам массива?

    Collin
    @Collin
    for (int i = 0; i < Enemy.Lenght; i++)
    {
    Enemy[i].SetActive(true);
    }


    or using foreach.

    foreach(GameObject gObj in Enemy)
    {
    gObj.SetActive(true);
    }
    Ответ написан
    Комментировать