yet another dev – Telegram
yet another dev
234 subscribers
141 photos
1 video
107 links
Самый скучный канал про разработку
Download Telegram
Технические статьи неспеша пишутся и пока не готовы, потому вот вам немного воскресных фоток из крепости Голубац, что в 140 км от Белграда.
🔥4
Топ 5 фотографий с прошедшего отпуска. За 10 дней проехали 2000 км по Сербии и много чего посмотрели. Было много гор и хайкинга. Немного городского отдыха. На фотках лишь малая часть. Вердикт: кросевое и интересное.

После России было необычно осознавать, что можно проехать от восточной до западной границы за 5 - 6 часов. В России самая долгая поездка на машине была 24 часа. Ехали без остановок в гостиницах, периодически меняясь с отцом (один отдыхает, другой рулит). За это время доехали только до Краснодара (там, кстати, тоже кросевое, но наверняка вы и так знаете). Широка и необъятна наша Родина 😄.
4❤‍🔥2
Keycloak is an open-source identity and access management (IAM) solution. It provides user authentication, authorization, and user management. Keycloak allows you to secure web applications by providing a centralized authentication and authorization mechanism. I wrote a step-by-step guide how to create a full stack secure application with OAuth2 authentication using React, ASP.NET Web API and Keycloak.
👍2
🇷🇺 Последнее время много пишу сервисов, которые используют top-level statements. Метод Main с таким синтаксическим сахаром упрощается и улучшается читаемость кода. Однако писать интеграционные тесты для таких сервисов становится сложнее — метод Main просто невозможно вызвать без лишних телодвижений. Недавно придумал относительно простое решение через рефлексию.

🇬🇧 Lately, I've been writing a lot of services that use top-level statements. The code with this kind of syntax sugar simplifies the Main method and improves readability. However, on the other hand, it makes it more difficult to create integration tests for the services. There isn't simply way to call the Main method and pass the necessary arguments. Recently, I found a relatively simply solution using reflection.
11
Прошёл месяц как я начал всерьёз учить сербский. Не могу сказать, что я начал полностью с нуля, т.к. живём тут с ноября 2022 г. Какие-то базовые фразы и слова уже знал. Учу следующим образом:
1. Два занятия в неделю по 1 часу с учителем на italki.
2. Домашка после занятий с учителем.
3. Каждый день новые слова по алгоритму карточек Anki. Начал со списка слов Габриела Вайнера + слова после уроков с учителем.

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

Примеры:

Предајем — учу, преподаю.
Налазим — нахожу.
Однесем — забираю.
Престанем — останавливаюсь.
Направим — делаю.
Честитам — поздравляю.
Славим — праздную.
Частим — угощаю.
👍2👏1
Как я снимался с воинского учёта

Если вдруг кто не знает, в своё время я успел отслужить в армии. После переезда в Сербию осенью прошлого года начал задумываться о снятии с учёта. Новые штрафы в 15к рублей за нарушение обязанностей по воинскому учёту только усилили это желание.

В интернете советуют заранее узнать нужные документы для военкомата (ВК). Я это не стал делал. Решил, что следующих документов будет достаточно:

- наклейка ВНЖ Сербии в загранпаспорте;
- трудовой договор;
- договор аренды жилья.

ВНЖ просто отксерил на цветном принтере. Уверење о бораваку НЕ делал. Копию ВНЖ и копию договора аренды перевёл на русский у судебного переводчика. Трудовой был на двух языках.

В августе отправил сканы с переводом в ВК через Госуслуги. Чуть позже пришёл отказ. Пришлось готовить документы к отправке в РФ и сниматься через родителей. Доверенность делал находясь в Сербии:

1. Взял шаблон с сайта посольства.
2. Скомпилировал текст доверенности из инфы в интернете.
3. Попросил отревьюить юристов и доработал после ревью.
4. Получился вот такой шаблон.
5. Перевёл на сербский у судебного переводчика.
6. Сходил к нотариусу для заверения.
7. С заверенной доверенностью сходил в «Први основни суд» чтобы поставить апостиль.
8. Перевёл апостиль на русский у судебного переводчика.

У нотаруса я общался на английском. Деньги на устный перевод с сербского на русский не тратил.

Заявление о снятии с учёта скачал с сайта Консультант и заполнил в нескольких экземплярах (на всякий).

Важно. Если вы в Сербии, то не совершайте ошибку как я – не пользуйтесь СДЕКом. Документы были отправлены 18 августа «экспресс» доставкой по самому дорогому тарифу. До получателя они дошли 27 сентября (фото 2). Обычной Поштой документы доходили за 10 дней. Как в остальных странах работает СДЕК – не знаю. Судя по отзывам, так же плохо.

6 октября родители сходили в ВК. Там все документы приняли без вопросов, и 13 октября выдали справку взамен военного билета.
👏3
🇬🇧 Performance issues when using a method as a parameter in C#. Are they real?

There is an article on Habr about performance issues when passing a method as a parameter in C#. The author showed that passing an instance method as a parameter inside for loops may degrade performance and increase memory consumption due to unnecessary object allocations in the heap. In this short article, I want to repeat the original benchmark and compare how things have changed since the .NET 7 release.

🇷🇺 Проблемы с производительностью в C# при передаче метода как параметр. Существуют ли они?

На Хабре есть статья, рассказывающая о проблемах с производительностью при передаче метода в качестве параметра. Автор показал, что передача метода экземпляра класса в качестве параметра внутри for может снизить производительность и увеличить потребление памяти из-за ненужного выделения объектов в куче. В этой короткой статье я хочу повторить исходный тест и узнать что изменилось с момента релиза .NET 7.
👍4
🇷🇺 Сегодня снова о микробенчмаркинге и о производительности в C#. На этот раз сосредоточимся на строках и наиболее эффективном способе извлечения подстроки.

🇬🇧 Today again about microbenchmarking and performance in C#. This time we'll focus on strings and the most efficient way to extract a substring.
👍4
Пару слов о банковской системе в Сербии

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

С таким аккаунтом можно делать 2 вещи:
- расплачиваться картой, в том числе онлайн и через Google Pay;
- снимать наличные динары и евро.

Всё остальное недоступно. Например, переводы денег физлицам или SWIFT-переводы.

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

1️⃣ Первый поход не увенчался успехом, из-за того, что на карте были необработанные транзакции. Такое встречается и в российских банках. Например, если зайти в приложение Тинькофф сразу после покупки, то можно обнаружить, что транзакция ещё обрабатывается. Видимо, изменение типа счёта аккаунта Raiffeisen при наличии таких транзакций может привести к неконсистентности их базы данных. 🤷‍♂️

2️⃣ Второй поход также не увенчался успехом. Мой первый Бели Картон (документ о регистрации иностранца без ВНЖ) остался прошлой осенью где-то в отеле, а на руках был только от 1 декабря 2022 года, который мне сделал владелец квартиры.

3️⃣ Третий поход - почти успех. Необработанных транзакций нет. Подходящий Бели Картон есть. Оформил все необходимые документы для запуска процедуры изменения счёта. Процедура занимает несколько часов. Сказали, можно приходить в конце рабочего дня.

4️⃣ Четвёртый поход - успех. Счёт стал резидентским. Подписал оставшиеся бумаги. Теперь можно пользоваться полноценным банковским аккаунтом.

По ощущениям, цифровизация в Сербии отстаёт лет на 10-15 от российского уровня.
👨‍💻3😁1
🇷🇺 Я уже писал статью о наиболее эффективном способе извлечения подстроки в C#. Мне захотелось ещё больше изучить Span структуры. К тому же недавно Microsoft выпустила платформу .NET 8, в которой есть несколько новых методов расширения для ReadOnlySpan<T>. В новой статье я сравню производительность методов MemoryExtensions с аналогами в классе string.

🇬🇧 I already wrote an article about the fastest way of extracting substrings in C#. Now I want to investigate Span structures more. Recently, Microsoft released the .NET 8 platform which has several new extension methods for ReadOnlySpan<T>. In the new article I compare the performance of MemoryExtensions methods with counterparts in string class.
👍2
Как я не стал предпринимателем в Сербии

На днях гуглил кое-какую техническую информацию по работе и наткнулся на сайт code-maze. Просмотрев статью, мой глаз зацепился за оранжевую кнопку с надписью «‎We are hiring!». Нажав на неё обнаружил, что можно наняться автором и писать технические статьи на темы, связанные с .NET. А поскольку я люблю писать тексты и у меня даже есть свой блог, то первая моя мысль была «Easy money!».

Я откликнулся. После нескольких дней переписки с владельцами ресурса для меня запустили процедуру онбординга. Первым этапом была регистрация на их ресурсах. При регистрации нужно было прочитать «‎Terms Of Agreement» в котором было то самое слово «‎tax». После чего меня осенило, что в другой стране ведь надо платить налоги c дохода! Работая по трудовому договору легко об этом забыть.

Чтобы получать доход легально нужно открыть предпринимательство. Предпринимательство в Сербии есть 2-х видов: «доходы минус расходы» и «фикс». В случае, если использовать «доходы минус расходы», то нужно вести бухгалтерию, либо отдавать на её аутсорс за несколько сотен евро. Если использовать «фикс», то каждый месяц независимо от дохода нужно будет платить около 50 000 динар (426 € на 20.12.2023). С учётом того, что за одну написанную статью можно будет заработать 80 € – 130 €, то выгоды от этого нет совсем никакой. К сожалению, аналога самозанятости в Сербии нет. Взвесив потенциальные сложности с оформлением ИП, посещением сербских государственных инстанций (это вообще отдельная тема) и уплатой налогов, то решил, что игра не стоит свеч. Статьи писать я могу и у себя в блоге, пусть и забесплатно.

Вот так я не стал предпринимателем в Сербии.
🏆3👌1
🇬🇧 In .NET, there is a so-called Options pattern that simplifies the way we handle application configuration. To use it, developers just need to follow three steps. First, add the necessary configuration provider. Second, set up Service Provider using Configure extension method. Third, inject either IOptions<T>, or IOptionsMonitor<T>, or IOptionsSnapshot<T> into the target class through constructor injecting.

.NET provides default configuration providers, like the JSON configuration provider with the AddJsonFile extension method. However, there are no providers for obtaining the configuration from database. In this article, we will consider several approaches to how to do it.

🇷🇺 В .NET есть так называемый паттерн Options, который упрощает работу с конфигурацией приложения. Для его использования достаточно выполнить три шага. Во-первых, добавить необходимый провайдер конфигураций (configuration provider). Во-вторых, настроить ServiceProvider на использование выбранного провайдера через метод расширения Configure. В-третьих, внедрить один из интерфейсов IOptions<T>, IOptionsMonitor<T> или IOptionsSnapshot<T> в нужный класс.

В .NET уже есть стандартные провайдеры конфигураций, как, например, для чтения из JSON. Однако нет провайдеров для чтения конфигураций из баз данных. В этой статье мы рассмотрим несколько подходов к тому, как это сделать.
4👨‍💻1
The 16-Byte Rule: Unraveling the Performance Mystery of C# Structures

🇬🇧 Many C# developers are familiar with the following statements. By default, when passing to or returning from a method, an instance of a value type is copied, while an instance of a reference type is passed by reference. This has led to a belief that utilizing structures may degrade the overall app performance, especially if the structure has a size greater than 16 bytes. The discussion about this is still ongoing. In this article, we will try to find the truth.

🇷🇺 Многие C# разработчики знакомы со следующим утверждением: по умолчанию, при вызове метода или возврате из него, экземпляр типа значения копируется, а экземпляр ссылочного типа передается по ссылке. В связи с этим распространено убеждение, что использование структур может снизить общую производительность приложения, особенно если размер структуры превышает 16 байт. Дискуссии на этот счёт до сих пор ведутся. В этой статье мы попытаемся докопаться до истины.
2