Леонид Павлов. "It specialist's tricks"
14 subscribers
77 photos
7 videos
5 files
59 links
Keep calm, no spam.
Download Telegram
Единственная причина того, что легаси никто не рефачит - разрабам лень переписывать тесты. #fun_minute
😁1
#csharp #protip
## Почему нужно использовать is null, вместо == null
Всё очень просто: оператор == можно перезаписать, а is - не оператор, и компилируется отличным от операторов способом.
Пример:
* Объявим класс, который переопределяет операторы сравнения, и возвращает истину, когда существующий объект сравнивают с null и код вернет истину, как будто наш объект равен null
class 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, с помощью оператора == и с помощью ключевого слова is
static 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/
🌐 Bing AI — это новый чат-бот от Microsoft, который использует технологию ChatGPT для ответа на вопросы пользователей. Он может помочь вам найти информацию в Интернете, ответить на вопросы и даже поддержать беседу на разные темы.

Если вы хотите получить доступ к новому Bing с ChatGPT из России, вот как это сделать:
🔵 Подключите VPN. Любой бесплатный VPN подойдет, например, AdGuard.
🔵 Откройте Microsoft Edge или скачайте его. В других браузерах пока есть сложности. Microsoft Edge можно скачать по этой ссылке: https://www.microsoft.com/ru-ru/edge.
🔵 Зайдите в свой аккаунт Microsoft. Можно сделать это прямо в браузере или по этой ссылке: https://account.microsoft.com/.
🔵 Если у вас еще нет аккаунта Microsoft, то его можно создать по этой ссылке: https://signup.live.com/.
🔵 Откройте страницу поисковика Bing — https://www.bing.com/.
🔵 Найдите раздел «Чат». Он находится в верхнем меню сайта рядом с разделами «Картинки», «Видео» и «Карты».
🔵 Нажмите кнопку «Присоединиться к списку ожидания».

Если вы получаете сообщение “Sorry, looks like your network settings are preventing access to this feature.”, то выполните следующие действия:
🔵 Смените регион аккаунта Microsoft на США
🔵 Установите расширение modheader
🔵 Добавьте пункты Request Headers -> X-Forwarded-For -> 1.1.1.1 и Request URL filters -> .://www.bing.com/.

Тэги: #ai #neural_networks #instructions
Please open Telegram to view this post
VIEW IN TELEGRAM
😭 Снова и снова я натыкаюсь на статьи и ответы на stackoverflow, в которых автор путает асинхронность, многопоточность и параллельность.

📢 Объясняю еще раз:

🟣 Параллельность и многопоточность - это два разных подхода к решению задачи одновременного выполнения нескольких задач.

🟣 Многопоточность - это подход, при котором несколько потоков исполняются параллельно в рамках одного процесса.
🟣 Параллельность - это подход, при котором несколько потоков исполняются параллельно на нескольких процессорах.
🟣 Асинхронность - это подход, при котором задачи выполняются в фоновом режиме без блокировки основного потока.

🟣 В C# есть несколько способов реализации многопоточности и параллельности, таких как Thread, ThreadPool, Task и Parallel.

🟣Thread и Task - это два разных подхода к решению задачи одновременного выполнения нескольких задач в C#.

🟣 Thread - это абстракция потока. Он работает на более низком уровне, чем Task и требует больше знаний и контроля со стороны разработчика. Thread представляет собой физический, системный поток выполнения.

🟣 Task - более высокоуровневая абстракция; это Promise, иначе говоря, некоторая операция, которая завершится в будущем. Task - это часть работы, которая выполнится и завершится в какой-то момент в будущем. Task перепрыгивает из потока в поток.

🟣 ThreadPool - это пул потоков, который позволяет создавать и использовать потоки из пула вместо создания новых потоков каждый раз.

🟣 Parallel - это класс, который позволяет выполнять параллельные операции в C#.
🔘 Parallel.ForEach не является асинхронным. Он выполняет задачи параллельно, но не использует асинхронные операции.

🟣 Ядра ЦП — это физические процессоры, которые выполняют вычисления и задачи.
🟣 Логические процессоры — это нефизические процессоры, которые операционная система идентифицирует как физические процессоры. Логические процессоры также связаны с потоками. Они поддерживаются технологией Hyper-Threading, встроенной в некоторые процессоры. При включенной гиперпоточности, получается два потока на ядро.

🟣 Процесс - это экземпляр программы во время выполнения.
🟣 Поток - это часть процесса, которая может выполнять код (инструкции)
🟣 Каждый процесс в Windows имеет по крайней мере один поток.
🟣Когда процесс запускается, ОС назначает ему память и ресурсы.
🟣Каждый поток внутри процесса использует память и ресурсы только этого процесса.
🟣Потоки могут быть созданы из любого потока процесса.
🟣Все потоки процесса используют его виртуальное адресное пространство и системные ресурсы.

🟣 Когда поток запускает блокирующий запрос ввода-вывода в рамках TPL, он немедленно возвращается, потому что запрос ввода-вывода по своей сути не является блокирующим.
🟣 TPL (Task Parallel Library) - это набор общедоступных типов и API в пространствах имен System.Threading и System.Threading.Tasks.

🟣 В Windows весь ввод-вывод является асинхронным. Синхронные API — это просто удобная абстракция.
🟣Когда вы используете HttpWebRequest.GetResponse, на самом деле происходит запуск ввода-вывода (асинхронно), а вызывающий поток (синхронно) блокируется, ожидая его завершения.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Преобразование mp4 в gif - периодически необходимо для прикрепления записи в issues:
ffmpeg -i input.mp4 output.gif
Tags: #ffmpeg #protip #gif #mp4
Интерактивное обучение git branching с визуализацией. Поможет разобраться в невидимых механизмах git, для тех, кто запоминает через визуализацию.

Покроет 99% возможных сценариев во время работы.

https://learngitbranching.js.org/?locale=ru_RU
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 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

$ npm install --save-dev env-cmd
$ env-cmd -f ./.env.dev npm start --watch

Где:
⚫️ --save-dev - зависимость, которая не будет восстановлена при использовании текущего модуля другим приложением.
⚫️ ./.env.dev - путь до .env файла
⚫️ Вторую комманду можно добавить в секцию packaje.json

  {
"scripts": {
"start:debug": "env-cmd -f ./.env.dev npm start --watch"
}
}

И использовать при запуске через $ npm run start:debug

#npm #nodejs #env #variables #protip
Please open Telegram to view this post
VIEW IN TELEGRAM
# Отловить Ctrl+C в консоли
Отлов события "отмены" в консольном приложении, и завершить все задачи, в которые проброшен CancellationToken
var factory = new CancellationTokenSource();
var cancellationToken = factory.Token;
Console.CancelKeyPress += delegate { factory.Cancel(); };
// ...
#protip #dotnet #net #netcore #csharp #concole #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:

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"

$ git describe master
v1.2.0-15-foobar123


#protip #git #release #versioning
# Архив релиза
Как полезно использовать команду 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
Павлов Леонид (2):
Merged PR 8558: #6299 Проверка прав доступа при выполнении job
Merged PR 6958: #6289 Записывать и выдавать поле "Дата последнего изменения"

#git #protip #release #changelog #versioning
🔥1
# Split number to digits
Способы разделения 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): 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 МБ. Этот кэш используется для хранения данных, которые нужны многим ядрам процессора одновременно, и позволяет увеличить общую пропускную способность системы.
# Node.js и многопоточность

Одной из основных проблем многопоточного программирования в Node.js является отсутствие истинной многопоточности. Вместо этого Node.js использует модель “event loop” (цикл событий), которая позволяет выполнять только один поток кода за раз. Это может привести к снижению производительности, особенно при выполнении длительных операций.

Event loop - это основной рабочий цикл в Node.js, который обрабатывает все входящие события и выполняет JavaScript-код. Он работает в одном потоке и не может быть заблокирован, чтобы не остановить обработку других событий.

Асинхронные операции в JavaScript работают с использованием event loop. Когда вы вызываете асинхронную функцию, она не блокируется и возвращает результат сразу же, а затем добавляет задачу в очередь для выполнения в будущем. Затем event loop продолжает обрабатывать другие задачи, пока не дойдет до асинхронной операции и не выполнит ее.

Async/await не является истинной многопоточностью, так как JavaScript по-прежнему является однопоточным языком. Однако, использование async/await позволяет писать код более читаемым и удобным для понимания образом, имитируя многопоточность.
# C# и многопоточность

C# - язык программирования с поддержкой многопоточности, позволяющий выполнять несколько потоков кода одновременно. Это обеспечивает более высокую производительность приложений и позволяет выполнять несколько задач параллельно.

Пул потоков - коллекция готовых к выполнению потоков, доступных для использования в приложении. Пул позволяет оптимизировать использование ресурсов, сокращая время на создание новых потоков и освобождая ресурсы после их выполнения.

Использование пула потоков включает использование класса ThreadPool, а также вызов метода QueueUserWorkItem для использования ресурсов потоков.

ThreadPool.QueueUserWorkItem(Work, null);

Продвинутое использование пула потоков, должно включать использование WaitCallback. Это делегат, передаваемый в метод, который будет выполнен в отдельном потоке, когда найдется свободный, для выполнения инструкций, поток.

WaitCallback callback = new WaitCallback(Work);
ThreadPool.QueueUserWorkItem(callback, null);
# async/await foreach

await foreach - это новый функционал, добавленный в C# 8.0, который позволяет асинхронно перебирать элементы коллекции, ожидая завершение асинхронных операций на каждой итерации.

Синтаксис await foreach выглядит следующим образом...

Читать далее...

https://wiki.lpavlov.site/en/CSharp/await_foreach