eshu_coding | Неотсортированное

Telegram-канал eshu_coding - Эшу быдлокодит

227

Гитхаб: https://github.com/vladzvx Навигация по каналу: #телеграм - о телеге и ботах #csharp - о шарпе #кодинг - разное об IT #проекты - мои проекты Стек: C#, PostgreSQL, Tarantool, MongoDB, RabbitMQ

Подписаться на канал

Эшу быдлокодит

Отпуск завершен, доехали до дома. Итого, 17 дней, около 5 тыс. километров, 10 мест ночёвки. У нас это первая такая масштабная поездка с 2017 года.

Основной итог: дети доросли до возраста, когда путешествовать с ними на машине на дальние расстояния в удовольствие, а машина для путешествий у нас близка к идеальной.

За все путешествие было несколько происшествий с машиной:
1. Сегодня с утра под Питером машина перестала реагировать на нажатие педали газа. Перезагрузка помогла, думаю программный сбой.
2. Пару раз мы похоже заправились ослиной мочой плохим бензином: загорался check engine, гас после следущий заправки.
3. Где-то по пути туда у нас начало трескаться лобовое стекло, видимо неудачно отлетел камень.

А так - болота, горы, бороды, бесконечные подъёмы - все препятствия машина преодолела на ура.

Теперь пора возвращаться к оседлой жизни. Если кому-то интересно что-то ещё про отпуск или машину - пишите в личку, подготовлю пост.

#отпуск

Читать полностью…

Эшу быдлокодит

В последний день в Кировске я с двумя детьми (3.5 и 6 лет) поехал на рыбалку на озеро Имандра. Поскольку я был в лодке с двумя детьми посреди большого водоёма на волне, было не до фотографирования красот озера, зато рыбу по прибытию я поснимал.

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

Ловили мы с лодки, арендованной на время с капитаном. Объек ловли - один из представителей пресноводных лососевых - сиг. Снасть использовалась довольно странная, чисто местная адаптация, сам бы я до такого не додумался.

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

Что интересно, на стоячую снасть рыба не берет, а вот передаваемые мормышке движения поплавка, скачущего по волнам, провоцируют рыбу на поклёвку.

#отпуск

Читать полностью…

Эшу быдлокодит

Нашел объяснение, почему в Хибинах настолько хорошие горные дороги. В 1970х годах неподалеку от водопада проводили подземные ядерные взрывы. Думаю для их подготовки и ликвидации последствий и был разровнян путь.

Это был эксперимент по подземному измельчению руды, использовались заряды в единицы килотонн: то есть аналоги ТЯО.

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

#отпуск

Читать полностью…

Эшу быдлокодит

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

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

Достаточно быстро я поймал пару микропикш, переделал оснастку под себя и отправился домой. За час с небольшим "ночной" рыбалки я слегка обгорел на ярком солнце: полярный день!

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

Наутро мы с детьми вернулись на это место и от души наловились мелочи. Кроме того, клюнула сайда где-то на полкило, а старший к своему восторгу выловил небольшую камбалу.

#отпуск

Читать полностью…

Эшу быдлокодит

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

Цены в местных кафе кусаются, меню развернуто в сторону северной кухни и деликатесов. В магазинах ассортимент как в среднем несетевом продуктовом магазине в Москве и области, цены несколько выше.

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

#отпуск

Читать полностью…

Эшу быдлокодит

Морская рыбалка на солидных глубинах - от 50 до 300 метров - это отдельный мир, с блеснами весом по 300 грамм и поленообразными удочками.

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

Спускаешь наживку на дно (глубина была метров 50) и начинаешь дрыгать удочкой. Через какое-то время садится рыба - треска или пикша весом 0.5 - 1.5 кг.

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

За час надергали 10 рыб, в сумме где-то килограмм на 7. А потом на час я превратился в работника рыбокомбината, обрабатывая улов.

#отпуск

Читать полностью…

Эшу быдлокодит

Кульминацией поездки в Териберку была морская прогулка с осмотром кита и ловлей рыбы в море.

Арендовав катер, мы вышли из залива. Сначала пошли на точку с китами. Там достаточно быстро увидели небольшого, с пару наших катеров, китенка (горбатый кит).

Судя по всему он рыбачил, к радости чаек сгоняя мелочь в кучу. На окружающие его катера с туристами внимания он не обращал никакого.

Посмотрев на кита, мы двинулись мимо птичьего базара на рыбалку.

#отпуск

Читать полностью…

Эшу быдлокодит

И завершу тему прошедшего отпуска небольшой подборкой фоточек с Селигера.

Читать полностью…

Эшу быдлокодит

В последнюю неделю апреля и в первых числах мая мы с семьёй (жена, я и двое детей - 6 и 3.5 лет) отправились в отпуск на Селигер.

Наверное самым запоминающимся моментом была ночь с 30 апреля на 1 мая. Мы как раз съехали с турбазы и отправились пожить с палатками в лесу на берегу озера. Фотка сделана около 1:00, когда я вел маящегося животом младшего погреться у печки во второй палатке. На следующее утро мы поняли, что с двумя детьми жить в лесу в снегу пока рановато и через новогодний заснеженный лес (на видео) эвакуировались на турбазу.

Читать полностью…

Эшу быдлокодит

Пожалуй пришло время обновить закреплённый пост. Каналу уже 5 лет, с прошлого закрепа изменилось многое.

Датасаенс, питон и наука были заброшены. В настоящий момент я работаю сеньор C# разработчиком в одном из российских банков.

За прошедшие 5 лет я сменил 4 места работы:
1. Фирма, занимающая АСУ ТП в области учёта ресурсов.
2. Медтех стартап в Сколково, делали системы поддержки принятия врачебных решений.
3. Сеть общепита, делал бэкенд службы доставки.
4. Банк, текущее место работы. Работаю в домене клиентских карточек.

Мой технологический стек:
C#, PostgreSQL. Плотно работал с MongoDB, RabbitMQ, Tarantool, умею строить базовую инфраструктуру: логи (Loki), метрики (Prometheus), девопсятина (gitlab, gitea, github actions, docker).

Поверхностно знаком с Apache Kafka, MS SQL и фронтовыми фреймворками - React.js и AvaloniaUI.

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

Далее будет навигация по каналу.

Общие теги:
#csharp@eshu_coding - общий тег для постов про разные аспекты разработки на языке программирования c#
#postgresql@eshu_coding - разные интересные моменты про PostgreSQL.
#devops@eshu_coding - мои эксперименты в девопсятине и инфраструктуре.
#mongodb@eshu_coding - записки про MongoDB.
#tarantool@eshu_coding - заметки про Tarantool.

Pet - проекты:
#палантир@eshu_coding - завершенный проект, которым я занимался весь 2021 год - поисковик по телеграму.
#sphagnum@eshu_coding - попытка написать свой брокер сообщений, пока застопорилась на стадии изучения теории и прототипирования по причине нехватки времени.

Книги:
#рихтер@eshu_coding - заметки и конспекты по основополагающей книге про C# - CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#, Джеффри Рихтер. Хоть .NET 4.5 вышел до моего появления в IT, внутренности платформы во основном остались прежними.

Конспекты прослушанных выступлений на конференциях:
#dotnext@eshu_coding - Dotnext 2023
#highload@eshu_coding - Highload++ 2024

Читать полностью…

Эшу быдлокодит

Последний интересный доклад был про подход к описанию архитектуры системы - Enterprise architecture on a page. Спикер был из МТС. Суть доклада следующая - был взять относительно новый подход к описанию архитектуры системы, доработан под нужды МТС, а затем внедрен.

Интересна реакция аудитории: процентов 90 восприняли доклад "это что за бред?" А вот люди, близкие к архитектуре очень заинтересовались. Мне пока не хватает квалификации понять всю глубину идеи, но зачем оно нужно - более менее понятно. Для описания того, о чем вещал спикер просто приложу ссылку на исходную идею, получившую развитие в МТС.

#conf
#highload

P.S. Я сам до конца не проникся, ибо не дорос ещё

Читать полностью…

Эшу быдлокодит

Ну чтож, пора подвести итоги года. В прошлом январе я писал планы. Итого, по пунктам:
1. Прочитал страниц 50 из Рихтера:)
2. DDD я покушал от души.
3. Не добрался
4. Не добрался
5. Не добрался
6. Не добрался
7. Не добрался

Э - эффективность, П - планирование.

Из позитивных итогов:
1. Вспомнил и прокачал SQL без ORM.
2. Познакомимся с чудесным продуктом для построения отчётов - FastReports. Теперь я точно знаю, что лучшее, что с ним можно сделать - удалить его к чёртовой матери.
3. Посмотрел и отрефлексировал многие глобальные вещи, касающиеся архитектуры и организации разработки.

Планы на 2025 надо будет тоже озвучить, но это несколько позже.

Читать полностью…

Эшу быдлокодит

Был в начале декабря на конференции Highload++ (да, только сейчас нашлось время оформить интересное услышанное в посты). Дальше посты будут под тегом #highload

Услышал ещё некоторые занятные вещи про постгресс.

Ситуация: таблица со счётчиками остатков товара на складе. На 100 строк, постоянно обновляется. При обновлении создаётся копия строки и хранится в блоке рядом с актуальной. В какой-то момент место в блоке кончается - приходится добавлять новую запись в индекс. В итоге под нагрузкой индекс забивается всяким мусором. Решение - индекс с датой последнего изменения, вычитывать последнее значение.

Есть у таблицы есть параметр vacuum_truncate. Разрешает вакууму освободить хвостик таблицы и отдать место ОС. Но есть нюанс - вакуум получает эксклюзивную блокировку таблицы на время пока он проверяет, что во всем кэше бд нет этих блоков и отдает их ОС. А если кэш бд - гигабайты - это может занимать минуты.

pg_stat_replication - посмотреть что происходит в репликации, какой из трёх занятых в ней процессов (отправка WAL по сети, прием WAL и складирование на диск, чтение и применение изменений к реплике) тормозит.

В постгресе 15+ prefetch при репликации по факту не используется, лучше отключить.

#postgresql

Читать полностью…

Эшу быдлокодит

#ef_core
#db_design
#postgresql

Тонкости JSONB в PostgreSQL и EF Core: Как постичь дзен?

Сегодня мы рассмотрим работу с JSONB в базе данных PostgreSQL совместно с родной для .NET ORM от Microsoft — Entity Framework Core.

Мы разберём, как удобно хранить данные в денормализованном виде, как защититься от параллельных изменений и как поступать, когда необходимо выстраивать отношения между сущностями, чьи атрибуты упакованы в JSONB. Помимо этого, мы затронем такие темы, как optimistic concurrency, data encryption, миграции подобных сущностей и их версионирование.

Итак, начнём.

Тонкости JSONB в PostgreSQL и EF Core: Как постичь дзен?

Читать полностью…

Эшу быдлокодит

Окончание заметок про постгрес.

15. Если у нас возник дедлок строки или какой-то запрос барабанит вечность - идем в представления pg_locks и pg_stat_activity, ищем источник проблемы и делаем с ним pg_cancel_backend или pg_terminate_backend.

16. Триггеры плохи не только сложностью отлова багов, но и тем что за счёт вызова доп функции на plsql, что трудозатратно.

17. Чистка мусора - vacuum - срабатывает автоматически при обновлении 20% записей. Можно подкрутить персональные настройки вакуумирования для таблиц.

18. Настройки постгреса идут из расчета, грубо говоря не более 8 ядер. Если на сервере ядер больше - можно просто выкручивать настройки параллельных воркеров пропорционально. Также диски где стоит postgres должны быть заполнены не более чем на половину, чтобы не было чудес.

#postgresql

Читать полностью…

Эшу быдлокодит

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

Изначально была идея доехать до места впадения в Белое море реки Поньгома и попытать счастья в ловле горбуши, но по пути нас поманило озеро Первое Березовое и мы не смогли проехать мимо.

Поставили палатку на небольшом песчаном пляже, отделяющем озеро от болота, и сутки постояли на природе. Заход в воду оказался идеален для купания детей: метров за 30 глубина доходит только до 80 см.

Главным событием рыбалки стало то, что старший таки разловил подаренный на день рождения спиннинг и поймал окуня. Но карельский гнус (слепни, комары и мошка, просачивающаяся через москитную сетку) дал о себе знать в полную силу и в середине дня мы поехали дальше.

#отпуск

Читать полностью…

Эшу быдлокодит

Во второй день в Хибинах мы сходили к водопаду с гидом, послушав про местную природу и геологию.

Поскольку медведи тут не редкость, шли с собаками (собака гида, белый самоед Дюна, и два двортерьера со шлагбаума горнолыжного курорта). Увязались они не зря, за свои услуги были щедро одарены бутербродами у водопада.

Пара километров по заросшему ущелью вдоль реки и мы у водопада. Покупались, перекусили обратно.

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

#отпуск

Читать полностью…

Эшу быдлокодит

Следующей точкой нашего путешествия стал город Кировск, небольшой город в Хибинах.

В первый день мы отправились на машине через половину Хибин к Рисйокскому водопаду. 26 километров горной дороги, существенная часть которой проходит по горной реке (едешь прямо по воде). Для горной дороги она в отличном состоянии, пройдет практически любой кроссовер (мы встретили по пути обратно Renault Kaptur).

Дорога постепенно идёт вверх и лесотундра в конце концов сменяется скалами, кое-где прикрытыми мхом. Там сейчас настоящая весна: цветет мать-и-мачеха и микрокустики вербы.

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

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

#отпуск

Читать полностью…

Эшу быдлокодит

Из Териберки мы отправились в Мурманск. Тут вовсю весна: цветут сирень, рябина и тюльпаны.

Вообще, Мурманск производит приятное впечатление: симпатичный сталинский центр, много зелени (в основном рябина). На одну из ключевых достопримечательностей - атомный ледокол Ленин - мы не попали. Зато погуляли по городу, послушали обзорную экскурсию и половили рыбу в заливе. Но о рыбалке будет отдельный пост.

Мурманск - уникальный приморский город, в котором набережная длиной всего 100(!) метров, несмотря на то, что город растянулся вдоль залива километров на 10.

Завершили мурманские сутки мы тем, что залезли на сопку на границе города, где расположен лабиринт, выложенный древними местными жителями, а кроме того симпатичная природа и открывается отличный вид на город и окрестные озера.

#отпуск

Читать полностью…

Эшу быдлокодит

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

Недалеко от входа есть несколько озер, побережье, где прибой Баренцева моря разбивается о скалы и валуны. Если пройти чуть дальше, можно дойти до Батарейского водопада, где вода ледяного озера падает со скал и уходит в ледяное море. Чуть дальше водопада находится арт батарея времен Великой отечественной войны.

На полпути к водопаду есть отличное место, которое стоит посетить с маленькими детьми: природная песочница с пологой песчаной горкой без камней.

Забравшись на прибрежные скалы (со стороны суши они пологие, есть натоптанные тропинки), можно попробовать разглядеть китов, которых обычно смотрят с катеров.

Идёт активное строительство и благоустройство, вскоре парк должен стать парком, а не просто куском охраняемой тундры.
#отпуск

Читать полностью…

Эшу быдлокодит

Небольшой птичий базар, мимо которого мы шли (корабли ходят, а плавает говно в проруби) на рыбалку. Тут гнездятся чайки, но в море мы видели и визитную карточку той же Исландии: тупиков.

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

#отпуск

Читать полностью…

Эшу быдлокодит

Неподалеку от Териберки есть достопримечательность: конец всех дорог. Грунтовка, ведущая через горы и внезапно кончающаяся у прибрежной скалы. Вот тут по пути - безумно красиво. Разноцветная тундра, скалы, свинцово-серое ледяное море под боком.

Со отвесных скал на дорогу текут ручьи, и, судя по всему, иногда падают камни. Дорога очень напоминает начало игры Готика: тот самый вход в долину рудников:)

По пути можно также залезть в пещеру под названием "Логово дракона", внутри которой кто-то отложил катку из трёх гранитных окатышей яйцевидной формы.

Дорогу до конца осилит только внедорожник: есть один крутой подъём, непреодолимый для большинства кроссоверов. На видео засняли спуск по пути обратно, во время подъема было не до съёмок.

#отпуск

Читать полностью…

Эшу быдлокодит

Ещё один занятный момент произошел когда мы остановились показать детям бобриную плотину на одном из ручьёв, который пересекала дорога, ведущая с турбазы. Из леса на водопой вышел кабанчик, спокойно попил и потрусил по своим делам дальше.

Читать полностью…

Эшу быдлокодит

Извиняюсь за долгое молчание, как-то не было ни интересных тем, ни желания что-то писать. Но тема появилась.

Столкнулся с необходимостью саггрегировать логи, хранящиеся в Opensearch, надо было взять уникальные сообщения об ошибках, по 1 шт. Логов после всех фильтров немного, десятки тысяч строк. Визуальный конструктор запросов не предложил ничего внятного, пошел в гугл - предлагает писать запросы в виде json-ов, как монга, но синтаксис естественно отличается.

С мыслью "вы наркоманы что-ли, ещё один оригинальный язык запросов?!" я отправился к нейронке, но она не помогла. Тогда я выгрузил результат как csv и нижеприведенным кодом на шарпе решил проблему.

var data = File.ReadAllLines("Книга1.csv")
.Select(line => line.Split(',')[2])
.Distinct()
.ToArray();

File.WriteAllLines("Книга2.csv", data);


Теперь печально задаюсь вопросом, почему каждая no-sql кочка изобретает свой язык запросов, а завозят ограниченную поддержку SQL для типовых ситуаций - далеко не все.

Читать полностью…

Эшу быдлокодит

Посмешу богов уже в третий раз. Мои планы на 2025 год.

1. Традиционно не выполняющийся пункт - вернуться к чтению и конспектированию умных книжек.
2. Хочу вкатиться поглубже в шарповый ui фреймворк AvaloniaUI.
3. Традиционно не выполняющийся пункт - вкатиться в мир алгозадачек.

Наверное этого хватит:)

Читать полностью…

Эшу быдлокодит

Продолжаю конспект интересных выступлений на #highload.

Услышал про интересный способ отпила куска от монолита. Я участвовал только в такой методике: изучаем код монолита, рядом строим микросервис по мотивам, потом долго и мучительно вычерпываем баги.

Спикер от hh рассказал об успешном применении другого подхода:
1. Монолит рефакторится так, чтобы выносимый в микросервис кусок был вынесен в отдельный модуль.
2. Модуль выносится в отдельный проект или пакет, одной строкой подключаемый в монолит.
3. Монолит начинает ходить в функционал будущего микросервиса сам к себе (!) по http.
4. После того, как убедились что все ок, модуль подключается в пустой проект, а в монолите меняется одна строка в конфигурации и он начинает ходить в микросервис.

Читать полностью…

Эшу быдлокодит

Продолжаю конспект интересных выступлений с конференции #highload

В Авито в качестве архитектурного паттерна используется "микросервисный ад", больше 4000 микросервисов. В итоге, чтобы понимать происходящее, они трассируют все запросы, а затем отправляют их в графовую базу neo4j, чтобы визуализировать все связи микросервисов и найти закономерности.

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

Нашли несколько колец, когда запрос через 3-4 микросервиса вызывает сам себя и в итоге всё отваливается по тайм-ауту.

А самый глубокий запрос выстроился в цепочку длиной в 51 (!) микросервис, через http.

Читать полностью…

Эшу быдлокодит

Раньше я упоминал про использование jsonb совместно с ORM.

Вышла очень крутая статья, раскрывающая нюансы этого вопроса.

Читать полностью…

Эшу быдлокодит

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

Обучение, заметки из которого я выкладывал выше - более масштабное мероприятие длиной в неделю.

Читать полностью…

Эшу быдлокодит

Еще небольшая порция заметок про постгрес.

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

13. Узнал о существовании разных джоинов - hash, merge и nested loop join. Первый использует хэш таблицу, чтобы объединить данные из разных таблиц, второй - использует сортировки, третий тупо перебирает данные. Первый хорош для джоина неиндексированных данных. Второй берет сортировку исходя из индексов, соответственно хорош при наличии сортированных (btree) индексов по обеим колонкам, по которым осуществляется джоин. Третий хорош, чтобы сджоинить мизерную таблицу с большой.

14. Натуральные и латеральные джоины. Натуральный джоин бесполезен на мой взгляд. А вот латеральный очень интересен. Он позволяет склеить данные с близкими значениями, например склеить значения измерений температуры и влажности с чуть отличающимся временными метками.

#postgresql

Читать полностью…
Подписаться на канал