Леонид Павлов. "It specialist's tricks"
14 subscribers
77 photos
7 videos
5 files
59 links
Keep calm, no spam.
Download Telegram
#pattern of the day
# State pattern

Pattern that allows manage with states of the object and events that executes before/on/after state changed and manage states routing.

Example:
var @object = new SomeObject();
var stateMachine = new StateMachine<TriggerEnum, StateEnum>(object);

stateMachine.InitState(StateEnum.NoAction);
stateMachine.Transition(TriggerEnum.TrigerSomething, StateEnum.ActionRunned, (obj, targetState) => Triggered(obj, targetState));

stateMachine.Do(TriggerEnum.TriggerSomething); // output: "Triggered on NoAction"

Console.WriteLine($"Current state: {@object.State.GetDisplay()}"); // output: Current state: ActionRunned

void Triggered(SomeObject obj, StateEnum state)
{
Console.WriteLine($"Triggered on {obj.State.GetDisplay()}");
obj.State = state;
}


See c# StateMachine that has powerful possibilities for state management: https://github.com/dotnet-state-machine/stateless
Found approach for DDD that called "aggregation root". It's looks good but only on paper (in theory) and works good with simple examples like "User, customer, shopping cart, order". On practice on every private setter you will create setter method (like in #2 of my examples). Also different methods for every system you work with. Not even talking about business logic inside database entity that violates SOLID's "single responsibility principle".
Easy localhost setup in different test environments:
IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];

#tricks #tests
Forwarded from Библиотека программиста
🛠 Всё, что нужно знать начинающему о Git: рассмотрим за 15 минут

Распределенная система контроля версий Git – популярный инструмент для координации параллельной работы и управления проектами в мире ИТ. Умение им пользоваться хотя бы на уровне основных команд необходимо даже начинающему разработчику.

🔗 Основной сайт
🔗 Зеркало
Это всё конечно хорошо, шпаргалки там, и прочее. Но без знания работы инструмента, нельзя пользоваться им профессионально. А git это один из основных инструментов программиста. Нет ничего лучше, чем прочитать книжку про git, и самая лучшая книга, которая дала мне все азы, порекомендовал мне мой первый senior еще много лет назад:
https://www.kobzarev.com/wp-content/uploads/books/git/progit.ru.pdf
На тему шпаргалок:
Можно распечатать этот листочек и повесить на стеночку, и с шансом 10% вы потратите на определение кодировки меньше минуты. И с шансом 1 из N количества вариаций кодировок (от cp8859-1 до cp8859-16, от win1250 до win1258 и тд.) вы вычислите нужную кодировку. А можно использовать обычные декодировщики (например этот меня выручал чаще чем остальные - https://2cyr.com/decode/?lang=ru).

Так же и со шпаргалками по языкам, инструментам. Если не знаете инструмент, который описывает шпаргалка, хотябы на среднем уровне, то и изучить инструмент шпаргалка не поможет. А если инструмент изучен достаточно, чтобы не искать в гугле каждую вторую команду, то шпаргалка не нужна, потому что повседневные вещи, которые в ней описаны, вы и так делаете с закрытыми глазами, а что-то специфическое очень вероятно, что в шпаргалке не описано, и всёравно придется лезть в документацию, в --help или гугл.
Единственная причина того, что легаси никто не рефачит - разрабам лень переписывать тесты. #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