Flexible Coding
149 subscribers
163 photos
2 files
96 links
Download Telegram
Под новый год JetBrains сделали мне "подарок" - отказались продлевать учебную лицензию для своих IDE. И ради интереса я решил посмотреть, а как там VS Code?

Мой прошлый опыт с VS Code был негативным - очень плохой автокомплит, отсутствуют встроенные Tests Explorer и Solution Explorer, рабочий проект очень медленно индексируется. Однако сейчас, с новым расширением от Microsoft "C# Dev Kit" всё поменялось:
- Довольно быстро индексируется проект
- Нормальный автокомплит с автоматическими using из коробки
- Встроенные обозреватели решений и тестов довольно удобные
- Наконец-то vs code парсит файл launchSettings.json и не нужно создавать кастомные конфигурации запуска проектов

А вместе с парой дополнительных плагинов со сниппетами и полезными командами получается отличный бесплатный инструмент. Всё ещё хуже, чем JetBrains Rider, но в разы лучше чем раньше

Подводя итоги - VS Code для меня стала лучшей бесплатной IDE под C#. Но я постараюсь вернуться в райдер)
Недавно прочитал две книги про продуктивность и тайм-менеджмент:
- Джедайские техники
- Путь Джедая

Об этих книгах я слышал много, но как-то руки не доходили их прочитать. Теперь вот дошли :)

Это самые базированные книги про продуктивность, и я рекомендую прочитать их абсолютно всем. По крайней мере первую. Основная мысль книги в том, что нам часто не хватает не времени, а некоторого когнитивного ресурса, который автор называет "мыслетопливом". И в книге подробно расписано, на что мы это мыслетопливо расходуем и как его экономить, правильно организуя свои дела и задачи. Ну и разные рекомендации про приложения, организацию и всё такое

Вторая книга призвана дополнить первую. Она разделена на две большие части - сначала введение, где мы определяем уровень своей организованности, а потом набор конкретных мыслей, практик, "вакцин" и рекомендаций для каждого уровня. Конкретно из этой книги я подчеркнул для себя идеи "красных" и "зелёных" задач и "практику стратегического продалбывания". Ну и ещё пару идей.

В обоих книгах полно отсылок на другие труды, такие как "Антихрупкость" Нассима Талеба или "Думай медленно - решай быстро" Канемана. Тоже очень порадовало, да и в целом читаются книги легко и приятно.

В общем, рекомендую. Даже не нашёл недостатков у этих книг :)
#книги
Всем привет!

Сегодня расскажу про одно приложение, о котором я знал давно, но только недавно начал пользоваться

Loom - приложение для записи экрана. По сути это просто расширение для браузера, которое позволяет очень быстро записать короткое видео и сразу поделиться им

Как его можно использовать?
- Если вы тестировщик, саппорт или разработчик, и вам необходимо показать факт воспроизведения какого-то бага. Иногда видео гораздо нагляднее и удобнее.
- В обучающих кейсах - быстро записать видео с пояснением как учитель, продемонстрировать домашнее задание - очень удобно
- Черновики для видеоконтента
- Много других кейсов

В бесплатной версии можно создавать до 25 видео по 5 минут, но старые неактуальные записи можно удалять. Есть ещё работа в команде в приложении, но я пока что не пользовался. Если кто-то уже затестил - пишите комментарии!

А ещё есть прикольные интеграции с разными сервисами - от GitHub до Notion. В общем, полезная штука, советую

#приложения
Flex Code
Неочевидный дизайн enum в C#

Недавно столкнулся с задачей сконвертировать строковое значение в Enum. В строке может быть как нормальное строковое значение из перечисления, так и число.
Задачка тривиальная:
- Вызываем Enum.TryParse(value, out var result)
- Если распарсили - используем это значение дальше
- Если нет - выполняем логику обработки отсутствия значения в enum

И тут на вход прилетает строковое значение "333" (такого значения в enum нет). А TryParse возвращает true. Итог - некорректное поведение системы. И нет, это не баг - это стандартное поведение метода TryParse.

Лично для меня супер неочевидно то, что TryParse не проверяет соответствие числа именованной константе из enum . Теперь знаю, что такое поведение исправляется с помощью метода IsDefined. (Источник - https://github.com/microsoft/referencesource/blob/master/mscorlib/system/enum.cs#L367)

А вот пример для воспроизведения:
var value = "333";

Console.WriteLine($"Пытаемся распарсить: '{value}'");

if (Enum.TryParse<SomeEnum>(value, out var result))
{
Console.WriteLine($"Результат парсинга - '{result}'. Тип - '{result.GetType().Name}'");
}
else
{
Console.WriteLine("Распарсить значение не удалось");
}
public enum SomeEnum
{
FirstValue = 0,
SecondValue = 1
}


Что интересно: в java и kotlin такого поведения не замечено (беглым тестом в онлайн компиляторе). В typescript тоже - при парсинге из числа, которое не входит в enum мы получаем undefined. Интересно, какие причины такой реализации?

#кейсы
{"query": {"bool": {"must": [{"nested": {"path": "nested_field","query": {"bool": {"must": [{ "match": { "nested_field.field1": "value1" }},{ "match": { "nested_field.field2": "value2" }}]}} }},{ "range": { "date_field": { "gte": "2024-01-01", "lte": "2024-02-01" }}}],"should": [{ "term": { "should_field": "value3" }},{ "term": { "should_field": "value4" }}]}}}. Как вам такое? Читаемо? Понятно? Это запрос в elasticsearch, причём не самый большой и сложный. С подобными огромными джейсонами без форматирования я сталкиваюсь очень часто. А ещё их часто надо сравнивать. А ещё я иногда использую регулярки. Есть тонна сайтов, которые решают каждую из этих проблем по отдельности, но это не очень удобно. У некоторых бесит дизайн, сами эти сайты нужно выискивать и добавлять в закладки...

Да, это снова рекомендации по приложениям. На этот раз - DevToys - мультитул разработчика. Очень удобная штука, которую использую как в работе, так и в пет-проектах.

Мои основные кейсы:
- Форматирование JSON (или XML) - часто из дебага вытаскиваю огромные запросы эластика и монги, и надо их раскрыть и проанализировать. Копирую огромный JSON, вставляю в DevToys - получаю читаемый текст. Много проблемных запросов обнаружил как раз благодаря этому инструменту
- Сравнение текстов - снова пример с запросами в БД. Допустим, есть баг - на продакшн среде и на тестовой среде разное поведение. Беру запрос с прода, с теста и сравниваю. Или просто какие-то тексты, результаты от API, и прочее - всё, что нельзя или неудобно сравнивать через гит
- Проверка регулярных выражений - иногда пользуюсь сайтом regex101, иногда этим приложением

В зависимости от задач и специфики работы могут пригодиться совершенно разные функции этого приложения. Думаю, что оно будет полезно не только разработчикам, но и аналитикам, тестировщикам и многим другим. В общем, пробуйте!
#приложения
Flex Code
1. Введение в Elasticsearch (вы здесь)
2. Разворачиваем Elasticsearch
3. CRUD-операции в Elasticsearch
4. Как Elasticsearch обрабатывает текст?

Введение в Elasticsearch

Elasticsearch - одна из самых популярных enterprise-поисковых систем. Если быть точным, это документоориентированная база данных, которая заточена под полнотекстовый поиск. Базируется на open source библиотеке Apache Lucene, которая предоставляет различные алгоритмы работы с текстом.

Полнотекстовый поиск - это поиск по части текста, по его отдельным словам или даже слогам. Мы часто встречаемся с таким поиском, когда используем поисковые системы в интернете - google, yandex и другие. Вот упрощённый вариант того, что происходит когда вы пишете запрос "Как установить elasticsearch":
1. Слова разбиваются на токены: ['Как', 'установить', 'elasticsearch']
2. Происходит поиск по тексту с проиндексированных сайтов на вхождение этих слов. Поиск не учитывает порядок, а просто ищет вхождение каждого слова и их комбинаций
3. Результаты ранжируются по релевантности: сначала те сайты, где есть все три слова в нужном порядке, потом сайты где просто есть эти слова и т.д.
4. Отсортированные результаты выдаются пользователю

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

Однако в качестве основной БД её лучше не использовать:
- Elastic не поддерживает транзакции
- Имеет все проблемы документных БД - отсутствие чёткой структуры и связей
- Субъективно конечно, но он довольно сложен в настройке и обслуживании. Базовые CRUD гораздо проще и надёжнее реализовать на каком-нибудь PostgreSQL.

Кстати, elastic это коммерческая организация, и у неё есть true open source аналог - OpenSearch

Flexible Coding
1. Введение в Elasticsearch
2. Разворачиваем Elasticsearch (вы здесь)
3. CRUD-операции в Elasticsearch
4. Как Elasticsearch обрабатывает текст?

Разворачиваем Elasticsearch для тестов

Попробуем развернуть эластик, чтобы в дальнейшем работать с ним. Самый простой способ установить его - использовать docker-compose (У вас он должен быть установлен).
Образы эластика можно брать из двух источников:
- Docker Registry самой компании elastic - недоступен из РФ. https://www.docker.elastic.co/r/elasticsearch
- Стандартный Docker Hub - https://hub.docker.com/_/elasticsearch. Он из РФ как раз доступен

Создайте файл docker-compose.yml и заполните его по аналогии
version: '3.8'

services:
test_elasticsearch:
image: elasticsearch:8.0.1
environment:
- bootstrap.memory_lock=true
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
ports:
- "9200:9200"

Далее выполните команду docker compose up -d. Если ошибок нет - поздравляю! Теперь у вас на ПК поднят elasticsearch.

Другие способы установки

Flexible Coding
1. Введение в Elastic
2. Разворачиваем Elasticsearch
3. CRUD-операции в Elasticsearch (вы здесь)
4. Как Elasticsearch обрабатывает текст?


CRUD-операции в Elasticsearch

Итак, эластик у нас поднят, теперь с ним можно делать всякое. Взаимодействие происходит по протоколу HTTP, поэтому можно воспользоваться утилитами curl или postman. Кстати, про HTTP я уже писал тут, тут и тут.

Вместо привычных таблиц у нас тут индексы. У индекса есть маппинг - описание полей в документе с их типами данных и другими параметрами. Этот маппинг может быть как динамическим (на основе документов, попадающих в индекс), так и ручным, когда мы задаём его самостоятельно.

Создать индекс - PUT /<index-name>
curl --location --request PUT 'http://localhost:9200/my-index'


В теле запроса можно передавать различные параметры, например маппинги (настройки полей), параметры индекса и др. Подробнее. Пока что добавим индекс без параметров, но держим в голове, что информацию о полях можно смотреть по запросу GET /my-index/_mappings.

Добавление документов
Добавляем новые документы с помощью POST-запроса, например:
curl --location 'http://localhost:9200/my-index/_doc' \
--header 'Content-Type: application/json' \
--data '{
"_id": 1,
"firstName": "Дмитрий",
"lastName": "Бахтенков",
"information": "Имеет канал Flexible Coding"
}'

И в ответе получим ID документа, в моём случае это 5CqcmY8B0U9Sp4Y4qDgB. А с помощью запроса GET /my-index/_doc/<id> можем получить наш документ.

Кстати, взглянем на маппинг. Каждое наше поле имеет тип данных text для полнотекстового поиска, и дополнительное поле keyword для агрегаций, сортировок и точного поиска.
"mappings": {
"properties": {
"firstName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"information": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}


Удаление документа
Тут всё просто. Удалять документы можно с помощью запроса DELETE /my-index/_doc/_id

Обновление документа
Обновляем документ с помощью POST-запроса: POST /<index>/_update/<_id>. В теле запроса отправляем новый json, который будет содержимым нашего документа

Flexible Coding
Скоро выступим!

https://t.me/exoz_tech/154