Popular Tags:

Запуск фоновых задач на C# с помощью HangFire

04.09.2019 at 13:34

Запуск задач в фоне — достаточно распространенная проблема. Библиотека HangFire не только сама отслеживает очередь таких задач, но и позволяет настраивать расписание выполнения. Задачи хранятся в хранилище (например SQL), что позволяет не терять запущенные задачи даже с рестартом приложения.

Для начала добавим необходимые пакеты

dotnet add package HangFire 
dotnet add package Hangfire.MemoryStorage

второй пакет — in memory хранилище задач. read more

Нахождение обратной матрицы на C#

04.09.2019 at 09:38

Обратная матрица — это такая матрица, умножение которой на исходную матрицу дает единичную матрицу.

Искать обратную матрицу будем методом Крамера. По этому методу нужно построить матрицу алгебраических дополнений, транспонировать ее и поделить на детерминант исходной матрицы. Алгебраическое дополнение для элемента матрицы в i строке и j столбце — это соответствующий минор, умноженный на -1 в степени i+j. read more

Генерация PDF в Flutter

10.08.2019 at 23:50

Создание PDF в Flutter

Для создания PDF я использовал пакет, который так и называется pdf. Доба, вляем в pubspec.yaml зависимость

pdf: ^1.3.17

и запускаем

flutter pub get

Теперь можно работать с pdf. Особенность пакета в том, что названия многих классов совпадают с классами в flutter. Советую импортировать библиотеки пакета с помощью алиасов. read more

Шпаргалка по SQL

28.03.2019 at 18:02


Собрал шаблоны типовых запросов, в конце поста задачник на эти запросы. Синтаксис во всех запросах — MS SQL.

Шаблоны типовых запросов SQL

Выборка записей из таблицы

select поле1, поле2 from таблица1

вместо списка полей может быть * — тогда выведудтся все поля

Выборка записей из таблицы с сортировкой по возрастанию

select поле1, поле2 from таблица1 order by поле1 asc

Выборка записей из таблицы с сортировкой по убыванию

select поле1, поле2 from таблица1 order by поле1 desc

Выборка записей из таблицы с условием на численное поле

select поле1, поле2 from таблица1 where поле1 = 777

вместо = может быть , < , >=, < =

Выборка записей из таблицы с условием на строковое поле
select поле1, поле2 from таблица1 where поле1 = "777"

Выборка с группировкой

select поле1, sum(поле2) from таблица1
group by поле1

вместо sum может быть min, max, count и другие функции
все поля, к которым не применяются функции, должны быть перечислены в секции group by

Выборка из двух таблиц

select таб1.поле1, таб2.поле2
from таблица1 as таб1
join таблица2 as таб2 on таб2.поле3 = таб1.поле4

вместо таблица2 может быть таблица1, если в таблице есть поле, ссылающееся на эту же таблицу

Вставка новой записи

insert into таблица1
    ([поле1], [поле2])
values
    (значениие1, значение2)

Изменение записи

update таблица1
set поле1 = значение1
where поле2 = значение2

Удаление записи

delete from таблица1
where поле1 = значение1

Задачник по SQL

Для решения задач можно использовать сервис http://sqlfiddle.com

Нужно выбрать базу данных MS SQL и создать тестовую базу запросом:

CREATE TABLE Departments
    ([Id] int, [Name] varchar(100))
;

CREATE TABLE Employees
    ([Id] int, [Name] varchar(100), [Salary] int, [ManagerId] int, [DepartamentId] int)
;

INSERT INTO Departments
    ([Id], [Name])
VALUES
    (1, 'Sales'),
    (2, 'Development')
;


INSERT INTO Employees
    ([Id], [Name], [Salary], [ManagerId], [DepartamentId])
VALUES
    (1, 'Ivanov', 100000, null, 1),
    (2, 'Petrov', 120000, 1, 1),
    (3, 'Sidorov', 130000, 2, 1),
    (4, 'Korotkov', 120000, 2, 1),
    (5, 'Filev', 90000, 1, 1),
    (6, 'Smirnov', 125000, null, 2),
    (7, 'Godov', 125000, null, null)  
;

Задачи:

  1. Фамилии и зарплаты всех сотрудников
  2. Фамилии и зарплаты всех сотрудников, отсортированные по зарплате по возрастанию
  3. Фамилии и зарплаты всех сотрудников, отсортированные по зарплате по убыванию
  4. Фамилии и зарплаты всех сотрудников, у которых зарплата больше 100000
  5. Фамилии и зарплаты всех сотрудников, у которых зарплата равна 100000
  6. Фамилии и зарплаты всех сотрудников, у которых зарплата больше либо равна 100000
  7. Фамилии и зарплаты всех сотрудников, у которых фамилия Ivanov
  8. Ид департамента и максимальная зарплата в этом департаменте
  9. Имя сотрудника и название его отдела
  10. Имя сотрудника и имя его начальника
  11. Добавить сотрудника с именем Semenov, зарплатой 70000, менеджером Ivanov и отделом Sales
  12. Изменить зарплату сотрудника Godov на 80000
  13. Удалить сотрудника Godov
”Решения

/*1.

read more

Создание и публикация nuget пакета

08.01.2019 at 17:18

nuget — это пакетный менеджер для C#. Создавать пакеты можно двумя способами: через Visual Studio и через командную строку. Я выбираю второй, так как его можно использовать на линуксе. Покажу на примере своего проекта ru.lsreg.math.

Сначала нужно зарегистрироваться на nuget.org

После этого добавляем в csproj файл в существующую PropertyGroup несколько свойств

< PackageId>ru.lsreg.math< /PackageId>
< Version>1.0.0< /Version>
< Authors>Mikhail Gubanov< /Authors>
< Company>lsreg.ru< /Company>
< PackageProjectUrl>http://lsreg.ru< /PackageProjectUrl>
< RepositoryUrl>https://github.com/lsreg/ru.lsreg.math< /RepositoryUrl>

Первые 4 обязательны, остальные опциональны. read more

Работа с матрицами на C#. Продолжение.

07.01.2019 at 12:08

Единичная матрица

Единичная матрица — это квадратная матрица, на главной диагонали которой все элементы равны 1, а все остальные элементы равны 0.

Для создания такой матрицы добавим статический метод

public static Matrix CreateIdentityMatrix(int n)
{
    var result = new Matrix(n, n);
    for (var i = 0; i < n; i++)
    {
        result[i, i] = 1;
    }
    return result;
}

По хорошему бы конечно использовать для таких целей именованный конструктор. read more

Детерминант матрицы на C#

28.12.2018 at 22:40

Детерминант (или определитель) матрицы можно вычислить огромным количеством способов. Мы воспользуемся следующей формулой:

где — определитель матрицы, полученной из исходной вырезанием 1 строки и j столбца.

Для начала научимся вырезать из матрицы столбец:

private Matrix CreateMatrixWithoutColumn(int column)
{
    if (column < 0 || column >= this.N)
    {
        throw new ArgumentException("invalid column index");
    }
    var result = new Matrix(this.M, this.N - 1);
    result.ProcessFunctionOverData((i, j) => 
        result[i, j] = j < column ?
read more

Бинарный поиск в C#

19.12.2018 at 14:01

Бинарный поиск — классический алгоритм. На вход алгоритм принимает отсортированный массив чисел и число для поиска. На выходе — индекс этого числа в массиве.

Алгоритмически это выглядит так:

  1. Запоминаем левую L и правую R границы массива (индексы, а не значения)
  2. Берем индекс M посередине между L и R
  3. Если значение массива по индексу M меньше нужного — L меняем на M, если больше — R меняем на M
  4. Возвращаемся на шаг 2

Таким образом мы на каждом шаге алгоритма сужаем область поиска в 2 раза. read more

Работа с матрицами в C#

17.12.2018 at 10:37

Матрица представляет из себя двумерный массив. Для начала создадим класс матрицы

public class Matrix {
    private double[,] data;

    private int m;
    public int M {get => this.m;}
    
    private int n;
    public int N {get => this.n;}
    
    public Matrix(int m, int n) 
    {
        this.m = m;
        this.n = n;
        this.data = new double[m, n];
    }
}

Пока этот класс явлеятся просто оберткой для двумерного массива. read more

Списки в flutter

07.12.2018 at 09:00

Для отображения списков в flutter используется виджет ListView. В свойство children нужно передать массив элементов списка

body: ListView(children: <Widget>[
  ListTile(title: Text('test 1')),
  ListTile(title: Text('test 2')),
  ListTile(title: Text('test 3'))
])

Выглядеть такой виджет будет вот так:

Содержимым ListView могут быть любые виджеты, не только ListTile. ListTile всего лишь подготовленный виджет, хорошо выглядящий в списке и имеющий много полезных свойств, например

ListTile(
  leading: Icon(Icons.work),
  title: Text('test 1'),
  trailing: Icon(Icons.star),
  subtitle: Text('subtitle text'),
  isThreeLine: true,
)

получится такой виджет:

Динамические списки в flutter

Чаще всего содержимое списка не известно заранее. read more