У кого какой ИКС?

Яндекс сегодня прислал письмо, что можно посмотреть свой ИКС на Вебмастере. Для тех, кому любопытно, ИКС у этого сайта = 10. Этого наверно минималка в связи пока еще низкой посещаемостью.

Из доступной мне статистики у этого сайта (https://bel-ozero.ru) ИКС = 120.
Там посещаемость где-то в 5 раз выше, чем здесь.

Давайте меряться ИКСами) У кого какой ИКС?

UPD. Здесь (https://webmaster.yandex.ru/sqi/?host=) можно посмотреть ИКС любого сайта. Например, у Википедии он равен 69000.

Горячие клавиши в Visual Studio

Сюда буду добавлять горячие клавиши в Visual Studio, способы быстрого ввода и прочие фишки, позволяющие кодить более комфортно.

Начнем с самого простого, что бывает нужно начинающему программисту:
cw + 2 раза Tab = Console.WriteLine();

Далее материалы статьи с Хабра, где-то с моими дополнениями, но в основном в чистом виде:

Читать далее Горячие клавиши в Visual Studio

Как удалить форматирование текста при вставке в RichTextBox в C#?

В процессе эксплуатации Блокнота 2.0 возникла проблема — при использовании черного фона во время копирования и вставки черного текста из Word он вставлялся черным, сливаясь с фоном. И вообще он полностью сохранял форматирование — начиная от шрифта, заканчивая отступами. А мы привыкли, что в блокноте все это удаляется.

Решение оказалось очень простым. Надо было добавить обработчик события при нажатии «Главное меню-Файл-Вставка» или Ctrl+V, где прописать следующий код:

private void PasteToolStripMenuItem_Click(object sender, EventArgs e)
{
    DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Text);
    rtb_Text.Paste(myFormat);
}

Где, rtb_Text — это и есть RichTextBox. У него есть метод Paste, которому нужно указать формат данных.

Как просто добавить навык Алисе

Если нужен простой навык Алисе — просто ответы на вопросы, пересылка на сайт, то есть отличный сервис Verter.

Порядок работы:

  1. Добавьте новый диалог в личном кабинете Яндекс.Диалоги.
  2. Укажите при добавлении Webhook URL, который даст сервис Verter. Это адрес, на который будут отправляться запросы.
  3. Настраивайте ответы на вопросы в разделе Вопросы-ответы в Verter.
  4. Тестируйте навык во вкладке Тестирование на платформе Яндекс.Диалоги. 
  5. Публикация навыка.

Рекомендации

  • Рекомендуется отправлять на модерацию только полезные навыки. Если вы сразу отправите пользователя на свой сайт — навык скорее всего будет признан рекламным.
  • Добавьте ответы на частые вопросы, расскажите о ваших продуктах и услугах.
  • Указывайте подсказки к ответам, чтобы пользователям навыка было проще задавать следующий вопрос.
  • Ключевое слово может состоять из 1 слова, если есть права на этот бренд, в остальных случаях надо использовать 2 и более (предлоги за слова не считаются).

Читать далее Как просто добавить навык Алисе

Блокнот 2.1

Отличия от обычного блокнота:

  • фон по умолчанию темный, при желании можно менять на светлый
  • отсечены многие ненужные мне пункты меню (печать, размер шрифта и т.п.)

Код программы: GitHub

Скачать программу: Setup_Notepad.exe

UPD: Решена проблема сохранения формата текста при вставке. Теперь исходное форматирование удаляется.

C# Level 1

Урок 1. Введение. Базовые типы данных. Консоль. Классы и методы.
Что такое .NET Framework; Создаем консольное приложение в VisualStudio. Переменные. Типы данных и их преобразование. Выводим и вводим данные через консоль. Первое знакомство с методами и классами.

Урок 2. Управляющие конструкции
Управляем ходом выполнения программы. Используем процедурный подход в написании программ. Познакомимся с рекурсией.

Урок 3. Методы. От структур к объектам. Исключения
Методы; рекурсия; структуры; от структур к объектам; статические поля и методы; исключения;

Урок 4. Массивы. Текстовые файлы
От объектов к массивам. От массивов к “сложным” задачам. Текстовые файлы

Урок 5. Символы, строки, регулярные выражения
Символы и строки; неизменяемые строки; StringBuilder, StringReader и StringWriter; регулярные выражения; практика.

Урок 6. Делегаты, файлы, коллекции
Делегаты; организация системы ввода-вывода; работа с файловой системой; коллекции; практика.

Урок 7. Введение в Windows Forms
От консольного приложения к Windows Forms; события и их обработчики; класс Form; создаём первое приложение.

Урок 8. Программирование “по-взрослому”
О рефлексии; что такое XML; сериализация и десериализация; создаём WindowsForms-приложение “Редактор вопросов для игры “Верю-Не верю”; создаём собственные классы для работы с данными; приложение Windows Forms для работы с XML-файловой базой данных.

Делегаты в C#

Толковое объяснение здесь: https://metanit.com/

Свой пример (см. строки 15, 29-38, 45):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

// Программа нахождения минимума функции на указанном отрезке
// На выбор 2 функции

namespace DoubleBinary
{
    class Program
    {
        delegate double Function(double a, double x);

        private static double F1(double a, double x)
        {
            return a * x * x;
        }

        private static double F2(double a, double x)
        {
            return a * Math.Sin(x);
        }
        
        public static void SaveFunc(string fileName, double a, double b, double h, int func)
        {
            // используя делегат выбираем нужную функцию и дальше ее используем (строка 48)
            Function del;
            if (func == 1)
            {
                del = F1;
            }
            else
            {
                del = F2;
            }

            FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
            BinaryWriter bw = new BinaryWriter(fs);
            double x = a;
            while (x <= b)
            {
                bw.Write(del.Invoke(a, x));
                x += h;
            }
            bw.Close();
            fs.Close();
        }
        public static double Load(string fileName)
        {
            FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            BinaryReader bw = new BinaryReader(fs);
            double min = double.MaxValue;
            double d;
            for (int i = 0; i < fs.Length / sizeof(double); i++)
            {
                // Считываем значение и переходим к следующему
                d = bw.ReadDouble();
                if (d < min) min = d;
            }
            bw.Close();
            fs.Close();
            return min;
        }

        public static int[] Menu()
        {
            int[] variables = new int[3];

            Console.Write("Выберите функцию: 1 - a*x^2; другое число - a*sin(x): ");
            variables[0] = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("На каком отрезке функции находить минимум?\n" +
                "Введите начальное значение X и конечное.\n" +
                "При этом a = начальному значению отрезка: ");
            variables[1] = Convert.ToInt32(Console.ReadLine());
            variables[2] = Convert.ToInt32(Console.ReadLine());

            return variables;
        }

        static void Main(string[] args)
        {
            int[] variables = Menu();

            SaveFunc("data.bin", variables[1], variables[2], 0.5, variables[0]);
            Console.WriteLine(Load("data.bin"));
            
            Console.ReadKey();
        }
    }
}

 

Массивы, классы (свойства, методы, конструкторы), чтение/запись txt

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

//+ 1. Дан целочисленный массив из 20 элементов.Элементы массива могут принимать целые
//значения от –10 000 до 10 000 включительно.Написать программу, позволяющую найти и
//вывести количество пар элементов массива, в которых хотя бы одно число делится на 3. В
//данной задаче под парой подразумевается два подряд идущих элемента массива.Например,
//для массива из пяти элементов: 6; 2; 9; –3; 6 – ответ: 4.
//+ 2. а) Дописать класс для работы с одномерным массивом.Реализовать конструктор, создающий
//+ массив заданной размерности и заполняющий массив числами от начального значения с
//+ заданным шагом.
//+ Создать свойство Sum, которые возвращают сумму элементов массива, 
//+ метод Inverse, меняющий знаки у всех элементов массива, 
//+ Метод Multi, умножающий каждый элемент массива на определенное число, 
//+ свойство MaxCount, возвращающее количество максимальных элементов.
//+ В Main продемонстрировать работу класса.
//+ б)* Добавить конструктор и методы, которые загружают данные из файла и записывают данные в
// файл

namespace Task_1_2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyArray array1 = new MyArray(20);
            array1.Print();
            Console.WriteLine("Количество пар, делящихся на 3 = " + array1.Pair_to_N(3));

            MyArray array2 = new MyArray(15, 0, 2);
            array2.Print();

            Console.WriteLine("Сумма: " + array2.Sum);

            array2.Inverse();
            Console.Write("Инверсия: ");
            array2.Print();

            array2.Multi(5);
            Console.Write("Умножаем на 5: ");
            array2.Print();

            Console.WriteLine("Количество максимальных элементов в массиве array1: " + array1.MaxCount);
            Console.WriteLine("Количество максимальных элементов в массиве array2: " + array2.MaxCount);
            MyArray array3 = new MyArray(100000);
            Console.WriteLine("Количество максимальных элементов в массиве array3: " + array3.MaxCount);

            MyArray array4 = new MyArray(@"D:\test.txt");
            Console.WriteLine("Тестим чтение из файла");
            array4.Print();
            Console.WriteLine("Тестим запись в файл массива array1 и чтение файла с обновленными данными");
            array1.Rec(@"D:\test.txt");
            Read(@"D:\test.txt");

            Console.ReadKey();
        }

        /// <summary>
        /// Метод считывания из файла txt
        /// </summary>
        /// <param name="filename">имя файла .txt</param>
        static void Read(string filename)
        {
            if (File.Exists(filename))
            {
                //Считываем все строки из файла
                string[] ss = File.ReadAllLines(filename);
                for (int i = 0; i < ss.Length; i++)
                {
                    Console.Write(ss[i] + " ");
                }
                Console.WriteLine();
            }
            else Console.WriteLine("Error load file");
        }
    }

    class MyArray
    {
        int[] a;
        Random rnd = new Random();
        
        /// <summary>
        /// Создаем целочисленный массив со случайными значениями от -10000 до 10000
        /// </summary>
        /// <param name="n">количество элементов</param>
        public MyArray(int n)
        {
            a = new int[n];
            for (int i = 0; i < n; i++)
                a[i] = rnd.Next(-10000, 10000);
        }

        /// <summary>
        /// Создаем целочисленный массив, заполняющийся числами от начального значения с заданным шагом.
        /// </summary>
        /// <param name="n">количество элементов</param>
        /// <param name="start">значение 0 элемента массива</param>
        /// <param name="step">шаг изменения каждого последующего значения</param>
        public MyArray(int n, int start, int step)
        {
            a = new int[n];
            for (int i = 0; i < n; i++)
            {
                a[i] = start + step * i;
            }
        }

        /// <summary>
        /// Читаем массив из файла
        /// </summary>
        /// <param name="filename">имя файла .txt</param>
        public MyArray(string filename)
        {
            //Если файл существует
            if (File.Exists(filename))
            {
                //Считываем все строки из файла
                string[] ss = File.ReadAllLines(filename);
                a = new int[ss.Length];
                //Переводим данные из строкового формата в числовой
                for (int i = 0; i < ss.Length; i++)
                    a[i] = int.Parse(ss[i]);
            }
            else Console.WriteLine("Error load file");
        }        
        /// <summary>
        /// Свойство для расчета суммы всех элементов целочисленного массива
        /// </summary>
        public int Sum
        {
            get
            {
                int sum = 0;
                for (int i = 0; i < a.Length; i++)
                {
                    sum += a[i];
                }
                return sum;
            }
        }

        /// <summary>
        /// Метод меняющий знаки элементов массива
        /// </summary>
        public void Inverse()
        {
            for (int i = 0; i < a.Length; i++)
            {
                a[i] *= -1;
            }            
        }

        /// <summary>
        /// Метод умножающий все элементы массива на число
        /// </summary>
        /// <param name="x">множитель</param>
        public void Multi(int x)
        {
            for (int i = 0; i < a.Length; i++)
            {
                a[i] *= x;
            }
        }

        /// <summary>
        /// Свойство, показывающие количество элементов массива с максимальным значением
        /// </summary>
        public int MaxCount
        {
            get
            {
                int max = a[0];
                int count = 1;
                for (int i = 1; i < a.Length; i++)
                {
                    if (a[i]>max)
                    {
                        max = a[i];
                        count = 1; 
                    }
                    else if (a[i] == max)
                    {
                        count++;
                    }
                }
                return count;
            }
        }

        /// <summary>
        /// Выводим на консоль все элементы массива в одной строке
        /// </summary>
        public void Print()
        {
            for (int i = 0; i < a.Length; i++)
            {
                Console.Write("{0} ", a[i]);
            }
            Console.WriteLine();
        }

        /// <summary>
        /// Выводит количеств пар элементов массива, делящихся на n без остатка
        /// </summary>
        /// <param name="n">делитель</param>
        /// <returns>количество пар элементов массива</returns>
        public int Pair_to_N(int n)
        {
            int count = 0;
            for (int i = 0; i < (a.Length - 1); i++)
            {
                if ((a[i]%n == 0) || (a[i+1]%n == 0))
                {
                    count++;
                }
            }
            return count;
        }

        /// <summary>
        /// Свойство для записи в файл
        /// </summary>
        /// <param name="filename"></param>
        public void Rec(string filename)
        {
            //переводим данные из чисел в строки
            string[] a_string = new string[a.Length]; 
            for (int i = 0; i < a_string.Length; i++)
                a_string[i] = Convert.ToString(a[i]);

            //пишем массив со строками в файл
            System.IO.File.WriteAllLines(filename, a_string);
        }   
    }
}

 

Согласованность данных: Foreign Keys

Создаем внешний ключ (foreign keys) для таблицы product.
Связываем ее с таблицей shop.brand, выбираем для колонки brand_id связь с id.
Если On Delete = NO ACTION, то БД не даст удалить бренд, если есть товар с этим брендом в таблице product.
Если On Delete = CASCADE, то БД при удалении бренда каскадно удаляет и все товары с этим брендов в таблице product.

P.S. Возникла проблема с сохранением. Когда-то в таблице были некорректные данные и они коряво удалились. Поэтому Workbench думает, что они есть и не дает установить внешние ключи. Пришлось удалить таблицу и создать заново, чтобы все заработало.

Первый class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//3. * Описать класс дробей - рациональных чисел, являющихся отношением двух целых чисел.
//     Предусмотреть методы сложения, вычитания, умножения и деления дробей. Написать
//     программу, демонстрирующую все разработанные элементы класса.
//  ** Добавить упрощение дробей.

namespace Task_3
{
    class Program
    {
        static void Main(string[] args)
        {
            Fraction x = new Fraction(1, 2);
            Fraction y = new Fraction(2, 3);
            Fraction z = new Fraction(311, 5222);

            Console.WriteLine(x.ToString() + " + " + y.ToString() + " = " + x.Plus(y).ToString());
            Console.WriteLine(x.ToString() + " - " + y.ToString() + " = " + x.Minus(y).ToString());
            Console.WriteLine(x.ToString() + " * " + y.ToString() + " = " + x.Multi(y).ToString());
            Console.WriteLine(x.ToString() + " / " + y.ToString() + " = " + x.Division(y).ToString());
            Console.WriteLine(x.ToString() + " + " + z.ToString() + " = " + x.Plus(z).ToString());
            Console.WriteLine(x.ToString() + " - " + z.ToString() + " = " + x.Minus(z).ToString());
            Console.WriteLine(x.ToString() + " * " + z.ToString() + " = " + x.Multi(z).ToString());
            Console.WriteLine(x.ToString() + " / " + z.ToString() + " = " + x.Division(z).ToString());

            Console.ReadKey();
        }
    }

    public class Fraction
    {
        int numerator, denominator;

        /// <summary>
        /// Конструктор без параметров
        /// </summary>
        public Fraction()
        {
            numerator = 0;
            denominator = 0;
        }
        
        /// <summary>
        /// Конструктор класса с числителем и знаменателем
        /// </summary>
        public Fraction(int num, int denom)
        {
            numerator = num;
            denominator = denom;
        }

        /// <summary>
        /// Сложение дробей
        /// </summary>
        /// <param name="x2">второе слагаемое</param>
        /// <returns>ответ</returns>
        public Fraction Plus(Fraction x2)
        {
            Fraction x3 = new Fraction();
            x3.numerator = numerator * x2.denominator + x2.numerator * denominator;
            x3.denominator = denominator * x2.denominator;
            Reduce(ref x3.numerator, ref x3.denominator);
            return x3;
        }

        /// <summary>
        /// Вычитание дробей
        /// </summary>
        /// <param name="x2">вычитаемое</param>
        /// <returns>ответ</returns>
        public Fraction Minus(Fraction x2)
        {
            Fraction x3 = new Fraction();
            x3.numerator = numerator * x2.denominator - x2.numerator * denominator;
            x3.denominator = denominator * x2.denominator;
            Reduce(ref x3.numerator, ref x3.denominator);
            return x3;
        }

        /// <summary>
        /// Умножение дробей
        /// </summary>
        /// <param name="x2">второй множитель</param>
        /// <returns>ответ</returns>
        public Fraction Multi(Fraction x2)
        {
            Fraction x3 = new Fraction();
            x3.numerator = numerator * x2.numerator;
            x3.denominator = denominator * x2.denominator;
            Reduce(ref x3.numerator, ref x3.denominator);
            return x3;
        }

        /// <summary>
        /// Деление дробей
        /// </summary>
        /// <param name="x2">делитель</param>
        /// <returns>ответ</returns>
        public Fraction Division(Fraction x2)
        {
            Fraction x3 = new Fraction();
            x3.numerator = numerator * x2.denominator;
            x3.denominator = denominator * x2.numerator;
            Reduce(ref x3.numerator, ref x3.denominator);
            return x3;
        }

        /// <summary>
        /// Метод сокращения дробей
        /// </summary>
        /// <param name="a">числитель</param>
        /// <param name="b">знаменатель</param>
        public void Reduce(ref int a, ref int b)
        {
            for (int i = 2; i < Math.Max(a, b); i++)
            {
                if (a % i == 0 && b % i == 0)
                {
                    a /= i;
                    b /= i;
                    i = 1; // начинаем цикл с начала
                }
            }
        }

        public string ToString()
        {
            return numerator + "/" + denominator;
        }
    }
}