Единственная причина того, что легаси никто не рефачит - разрабам лень переписывать тесты. #fun_minute
😁1
#csharp #protip
## Почему нужно использовать
Всё очень просто: оператор
Пример:
* Объявим класс, который переопределяет операторы сравнения, и возвращает истину, когда существующий объект сравнивают с
* А теперь сравним существующий объект с
* Вывод консоли:
Бинго!
## Почему нужно использовать
is null, вместо == nullВсё очень просто: оператор
== можно перезаписать, а is - не оператор, и компилируется отличным от операторов способом.Пример:
* Объявим класс, который переопределяет операторы сравнения, и возвращает истину, когда существующий объект сравнивают с
null и код вернет истину, как будто наш объект равен nullclass SomeObject
{
public static bool operator ==(SomeObject left, object right)
{
if (right is null)
{
return true;
}
return false;
}
public static bool operator !=(SomeObject left, object right)
{
if (right is null)
{
return false;
}
return true;
}
}
* А теперь сравним существующий объект с
null, с помощью оператора == и с помощью ключевого слова isstatic void Main(string[] args)
{
var isNullOperator = new SomeObject() == null;
var isNullIs = new SomeObject() is null;
Console.WriteLine($"Вывод через == : {isNullOperator}");
Console.WriteLine($"Вывод через is : {isNullIs}");
}
* Вывод консоли:
Вывод через == : True
Вывод через is : False
Бинго!
#tools
Редактор OpenApi, который превращается в привычный swagger.
Очень удобная штука для проработки контрактов.
https://editor.swagger.io/
Редактор OpenApi, который превращается в привычный swagger.
Очень удобная штука для проработки контрактов.
https://editor.swagger.io/
Если вы хотите получить доступ к новому Bing с ChatGPT из России, вот как это сделать:
Если вы получаете сообщение “Sorry, looks like your network settings are preventing access to this feature.”, то выполните следующие действия:
Тэги: #ai #neural_networks #instructions
Please open Telegram to view this post
VIEW IN TELEGRAM
Microsoft
Microsoft account | Sign In or Create Your Account Today – Microsoft
Sign In with your Microsoft account. One account. One place to manage it all. Welcome to your account dashboard.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Интерактивное обучение git branching с визуализацией. Поможет разобраться в невидимых механизмах git, для тех, кто запоминает через визуализацию.
Покроет 99% возможных сценариев во время работы.
https://learngitbranching.js.org/?locale=ru_RU
Покроет 99% возможных сценариев во время работы.
https://learngitbranching.js.org/?locale=ru_RU
Sql advanced query. Выбрать все foreign keys которые ссылаются на таблицу:
#protip #sql
SELECT
OBJECT_NAME(f.parent_object_id) TableName,
COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM
sys.foreign_keys AS f
INNER JOIN
sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN
sys.tables t
ON t.OBJECT_ID = fc.referenced_object_id
WHERE
OBJECT_NAME (f.referenced_object_id) = 'YourTableName'
#protip #sql
🔥1
# Подгрузка переменных среды из .env файла при npm run
⚫️
⚫️
⚫️ Вторую комманду можно добавить в секцию packaje.json
И использовать при запуске через
$ npm install --save-dev env-cmdГде:
$ env-cmd -f ./.env.dev npm start --watch
--save-dev - зависимость, которая не будет восстановлена при использовании текущего модуля другим приложением../.env.dev - путь до .env файла {
"scripts": {
"start:debug": "env-cmd -f ./.env.dev npm start --watch"
}
}И использовать при запуске через
$ npm run start:debug
#npm #nodejs #env #variables #protipPlease open Telegram to view this post
VIEW IN TELEGRAM
# Отловить Ctrl+C в консоли
Отлов события "отмены" в консольном приложении, и завершить все задачи, в которые проброшен CancellationToken
Отлов события "отмены" в консольном приложении, и завершить все задачи, в которые проброшен CancellationToken
var factory = new CancellationTokenSource();#protip #dotnet #net #netcore #csharp #concole #cancel
var cancellationToken = factory.Token;
Console.CancelKeyPress += delegate { factory.Cancel(); };
// ...
Леонид Павлов. "It specialist's tricks"
Sql advanced query. Выбрать все foreign keys которые ссылаются на таблицу: SELECT OBJECT_NAME(f.parent_object_id) TableName, COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns…
Sql advanced query. Выбрать все foreign keys в схеме. Теперь для postgresql:
#protip #postgres #pgsql #sql #foreign_key
SELECT conrelid::regclass AS table_from
, conname
, pg_get_constraintdef(oid)
FROM pg_constraint
WHERE contype IN ('f', 'p ')
AND connamespace = 'public'::regnamespace -- your schema here
ORDER BY conrelid::regclass::text, contype DESC;
#protip #postgres #pgsql #sql #foreign_key
# Автогенерация версии через Git
В Git есть встроенная команда, которая берет ближайший тэг, отсчитывает кол-во коммитов с тех пор, и прибавляет sha1 текущего коммита.
итого, результат выполнения команды, на последнем коммите с sha1=foobar123, если ближайший tag был 15 коммитов назад, а название тэга было "v1.2.0"
#protip #git #release #versioning
В Git есть встроенная команда, которая берет ближайший тэг, отсчитывает кол-во коммитов с тех пор, и прибавляет sha1 текущего коммита.
итого, результат выполнения команды, на последнем коммите с sha1=foobar123, если ближайший tag был 15 коммитов назад, а название тэга было "v1.2.0"
$ git describe master
v1.2.0-15-foobar123
#protip #git #release #versioning
# Архив релиза
Как полезно использовать команду
На выходе получим архив с нашим проектом.
Для архивации в zip, нужно добавить аргумент
#protip #git #release
Как полезно использовать команду
git describe? В совокупности с командой git archive.$ git archive master --prefix='project/' | gzip > `git describe master`.tar.gz
v1.2.0-15-foobar123.tar.gz
На выходе получим архив с нашим проектом.
Для архивации в zip, нужно добавить аргумент
--format=zip #protip #git #release
# Changelog релиза
Можно собрать все сообщения ветки, в некую историю изменений, для отчетности или прикрепления к сообщению релиза.
Можно собрать все сообщения ветки, в некую историю изменений, для отчетности или прикрепления к сообщению релиза.
$ git shortlog --no-merges masterЕще можно взять только изменения, до предыдущего релиза (до определенного тэга)
Павлов Леонид (4):
Merged PR 8558: #6299 Проверка прав доступа при выполнении job
Merged PR 6958: #6289 Записывать и выдавать поле "Дата последнего изменения"
Merged PR 6956: #6192 Вынести логи с ошибками в отдельный файл
Merged PR 6941: #6166 Убрать поле TemplateId из метода GET
$ git shortlog --no-merges master --not v1.2.0#git #protip #release #changelog #versioning
Павлов Леонид (2):
Merged PR 8558: #6299 Проверка прав доступа при выполнении job
Merged PR 6958: #6289 Записывать и выдавать поле "Дата последнего изменения"
🔥1
# Split number to digits
Способы разделения int числа на цифры.
## Способ №1
Красивый.
Время выполнения: ~89.06ns
Время обработки ошибки: 2.130ns
Требования памяти: 248 B
## Способ №2
Быстрый.
Время выполнения: ~39.15ns
Время обработки ошибки: 0.861ns
Требования памяти: 64 B
Способы разделения int числа на цифры.
## Способ №1
Красивый.
Время выполнения: ~89.06ns
Время обработки ошибки: 2.130ns
Требования памяти: 248 B
public int[] Stack()
{
var list = new Stack<int>(32);
var remainder = digit;
do
{
list.Push(remainder % 10);
remainder /= 10;
} while (remainder != 0);
return list.ToArray();
}
## Способ №2
Быстрый.
Время выполнения: ~39.15ns
Время обработки ошибки: 0.861ns
Требования памяти: 64 B
public static int[] GetDigits(int n)
{
if (n == 0)
return new[] {0};
var x = Math.Abs(n);
var numDigits = NumberOfDigits(x);
var res = new int[numDigits];
var count = 0;
while (x > 0)
{
res[count++] = x % 10;
x /= 10;
}
Array.Reverse(res);
return res;
}
public static int NumberOfDigits(int n)
{
if (n >= 0)
{
if (n < 10) return 1;
if (n < 100) return 2;
if (n < 1000) return 3;
if (n < 10000) return 4;
if (n < 100000) return 5;
if (n < 1000000) return 6;
if (n < 10000000) return 7;
if (n < 100000000) return 8;
if (n < 1000000000) return 9;
return 10;
}
else
{
if (n > -10) return 2;
if (n > -100) return 3;
if (n > -1000) return 4;
if (n > -10000) return 5;
if (n > -100000) return 6;
if (n > -1000000) return 7;
if (n > -10000000) return 8;
if (n > -100000000) return 9;
if (n > -1000000000) return 10;
return 11;
}
}
# Энциклопедия численных последовательностей
https://oeis.org
Например:
По последовательности A005188, приводится следующая информация:
* Описание: Числа Армстронга (или плюсуперфектные, или Плюс совершенные, или нарциссические): m-значные положительные числа, равные сумме m-й степени их цифр.
* Формула (для Mathematica OEIS package):
Многие статьи wikipedia ссылаются в математических статьях, на этот сайт.
https://oeis.org
Например:
По последовательности A005188, приводится следующая информация:
* Описание: Числа Армстронга (или плюсуперфектные, или Плюс совершенные, или нарциссические): m-значные положительные числа, равные сумме m-й степени их цифр.
* Формула (для Mathematica OEIS package):
f[n_] := Plus @@ (IntegerDigits[n]^Floor[ Log[10, n] + 1]); Select[ Range[10^7], f[ # ] == # &]
* Формула программная, например для Python:from itertools import combinations_with_replacementА так же упоминания в книгах, научных статьях и применение в других алгоритмах последовательностей. Примеры последовательностей, комментарии к алгоритму.
A005188_list = []
for k in range(1, 10):
a = [i**k for i in range(10)]
for b in combinations_with_replacement(range(10), k):
x = sum(map(lambda y:a[y], b))
if x > 0 and tuple(int(d) for d in sorted(str(x))) == b:
A005188_list.append(x)
A005188_list = sorted(A005188_list)
Многие статьи wikipedia ссылаются в математических статьях, на этот сайт.
# L1, L2, L3 кэш процессора
Современные процессоры обладают несколькими уровнями кэширования, которые служат для ускорения доступа к данным и инструкциям, хранящимся в основной памяти. Они позволяют сократить время доступа к часто используемым данным.
Кэш процессора представляет собой промежуточную память, которая служит буфером между процессором и основной памятью компьютера. Он предназначен для хранения часто используемых данных и инструкций, что позволяет сократить время их доступа и увеличить общую производительность системы. Современные процессоры обычно имеют несколько уровней кэша: L1, L2 и L3, каждый из которых имеет свою специфику и предназначение.
L1 кэш - это самый быстрый и ближайший к процессору уровень кэша. Он используется для хранения данных и инструкций, к которым процессор обращается наиболее часто. Размер L1 кэша обычно составляет от 32 до 256 КБ и он разделен на две части: данные и инструкции.
L2 кэш - служит для хранения данных, к которым часто обращается процессор, но которые не находятся в L1 кэше. Этот уровень кэша находится на том же кристалле процессора, что и L1 кэш, и имеет размер от 256 до 512 КБ.
L3 кэш - является самым медленным уровнем кэша, но и самым большим. Он обычно располагается на другом кристалле, чем L1 и L2 кэши, и может иметь размер от 1 до 64 МБ. Этот кэш используется для хранения данных, которые нужны многим ядрам процессора одновременно, и позволяет увеличить общую пропускную способность системы.
Современные процессоры обладают несколькими уровнями кэширования, которые служат для ускорения доступа к данным и инструкциям, хранящимся в основной памяти. Они позволяют сократить время доступа к часто используемым данным.
Кэш процессора представляет собой промежуточную память, которая служит буфером между процессором и основной памятью компьютера. Он предназначен для хранения часто используемых данных и инструкций, что позволяет сократить время их доступа и увеличить общую производительность системы. Современные процессоры обычно имеют несколько уровней кэша: L1, L2 и L3, каждый из которых имеет свою специфику и предназначение.
L1 кэш - это самый быстрый и ближайший к процессору уровень кэша. Он используется для хранения данных и инструкций, к которым процессор обращается наиболее часто. Размер L1 кэша обычно составляет от 32 до 256 КБ и он разделен на две части: данные и инструкции.
L2 кэш - служит для хранения данных, к которым часто обращается процессор, но которые не находятся в L1 кэше. Этот уровень кэша находится на том же кристалле процессора, что и L1 кэш, и имеет размер от 256 до 512 КБ.
L3 кэш - является самым медленным уровнем кэша, но и самым большим. Он обычно располагается на другом кристалле, чем L1 и L2 кэши, и может иметь размер от 1 до 64 МБ. Этот кэш используется для хранения данных, которые нужны многим ядрам процессора одновременно, и позволяет увеличить общую пропускную способность системы.
# Node.js и многопоточность
Одной из основных проблем многопоточного программирования в Node.js является отсутствие истинной многопоточности. Вместо этого Node.js использует модель “event loop” (цикл событий), которая позволяет выполнять только один поток кода за раз. Это может привести к снижению производительности, особенно при выполнении длительных операций.
Event loop - это основной рабочий цикл в Node.js, который обрабатывает все входящие события и выполняет JavaScript-код. Он работает в одном потоке и не может быть заблокирован, чтобы не остановить обработку других событий.
Асинхронные операции в JavaScript работают с использованием event loop. Когда вы вызываете асинхронную функцию, она не блокируется и возвращает результат сразу же, а затем добавляет задачу в очередь для выполнения в будущем. Затем event loop продолжает обрабатывать другие задачи, пока не дойдет до асинхронной операции и не выполнит ее.
Async/await не является истинной многопоточностью, так как JavaScript по-прежнему является однопоточным языком. Однако, использование async/await позволяет писать код более читаемым и удобным для понимания образом, имитируя многопоточность.
Одной из основных проблем многопоточного программирования в Node.js является отсутствие истинной многопоточности. Вместо этого Node.js использует модель “event loop” (цикл событий), которая позволяет выполнять только один поток кода за раз. Это может привести к снижению производительности, особенно при выполнении длительных операций.
Event loop - это основной рабочий цикл в Node.js, который обрабатывает все входящие события и выполняет JavaScript-код. Он работает в одном потоке и не может быть заблокирован, чтобы не остановить обработку других событий.
Асинхронные операции в JavaScript работают с использованием event loop. Когда вы вызываете асинхронную функцию, она не блокируется и возвращает результат сразу же, а затем добавляет задачу в очередь для выполнения в будущем. Затем event loop продолжает обрабатывать другие задачи, пока не дойдет до асинхронной операции и не выполнит ее.
Async/await не является истинной многопоточностью, так как JavaScript по-прежнему является однопоточным языком. Однако, использование async/await позволяет писать код более читаемым и удобным для понимания образом, имитируя многопоточность.
# C# и многопоточность
C# - язык программирования с поддержкой многопоточности, позволяющий выполнять несколько потоков кода одновременно. Это обеспечивает более высокую производительность приложений и позволяет выполнять несколько задач параллельно.
Пул потоков - коллекция готовых к выполнению потоков, доступных для использования в приложении. Пул позволяет оптимизировать использование ресурсов, сокращая время на создание новых потоков и освобождая ресурсы после их выполнения.
Использование пула потоков включает использование класса
C# - язык программирования с поддержкой многопоточности, позволяющий выполнять несколько потоков кода одновременно. Это обеспечивает более высокую производительность приложений и позволяет выполнять несколько задач параллельно.
Пул потоков - коллекция готовых к выполнению потоков, доступных для использования в приложении. Пул позволяет оптимизировать использование ресурсов, сокращая время на создание новых потоков и освобождая ресурсы после их выполнения.
Использование пула потоков включает использование класса
ThreadPool, а также вызов метода QueueUserWorkItem для использования ресурсов потоков. ThreadPool.QueueUserWorkItem(Work, null);Продвинутое использование пула потоков, должно включать использование
WaitCallback. Это делегат, передаваемый в метод, который будет выполнен в отдельном потоке, когда найдется свободный, для выполнения инструкций, поток.WaitCallback callback = new WaitCallback(Work);
ThreadPool.QueueUserWorkItem(callback, null);
# async/await foreach
Синтаксис
Читать далее...
https://wiki.lpavlov.site/en/CSharp/await_foreach
await foreach - это новый функционал, добавленный в C# 8.0, который позволяет асинхронно перебирать элементы коллекции, ожидая завершение асинхронных операций на каждой итерации.Синтаксис
await foreach выглядит следующим образом...Читать далее...
https://wiki.lpavlov.site/en/CSharp/await_foreach