Dev4Devs
10 subscribers
17 photos
6 files
43 links
Возможно, когда нибудь, этот канал с заметками на IT тематику превратиться в что-то большее, но пока тут только заметки
#dev #csharp #it #tips #development #code #prog #devops #software
Download Telegram
📖 ТОП-10 книг, без которых не обойтись ни одному программисту

Мы подготовили для вас подборку из 10 книг, без которых не обойтись ни одному профессионалу в IT. Эти книги станут для вас настольными на долгие годы.

🔗 Основной сайт
🔗 Зеркало
Pro_CSharp_10_with_NET_6_Andrew_Troelsen_Phil_Japikse_Apress_9781484278680.pdf
46 MB
📖📚 Pro C# 10 with .NET 6: Foundational Principles and Practices in Programming 11st ed. Edition
#book #csharp #dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩 Хотите по-настоящему погрузиться в ASP.NET Core? Тогда ловите порядка пятисот практических примеров использования большинства низкоуровневых API для ASP.NET Core 6.0, 7.0 и 8.0 Preview 7 (а также 2.1, 2.2, 3.1 и 5.0).

🔗 GitHub
🚀System Design 101

Готовитесь к собеседованию по проектированию систем или просто хотите понять принцип работы сложных систем? Тогда репозиторий ByteByteGo точно для вас.

👉 GitHub
Конвертация Enum в Json в виде строки
#dotnet #tip #json #enum
class Example
{
[JsonConverter(typeof(JsonStringEnumConverter<ChequeType>))]
public ChequeType Type { get; set; }
}

enum ChequeType
{
Common,
Refund,
Unknown
}
🗺 Настраиваем маппинг в объявлении типа (AutoMapper Extension)
#type #automapper #mapping #dotnet
📱 Github
https://github.com/hamaronooo/KutCode.AutoMapper.Extensions
public class SomeEntity
{
public string Value { get;set; }
}

public class SomeDto : IMapWith<SomeEntity> // <-- just inherit it
{
public string Value { get;set; }
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳 Удобный alias для просмотра запущенных Docker контейнеров
После создания alias командой ниже, вызываем его » dpsl
#docker #alias #linux
alias "dpsl"="docker ps -a --format \"table {{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Ports}}\t{{.Status}}\" --no-trunc"
🔧 kubectl autocomplete with ZSH and aliases
#kuber #kubectl #setup #autocomplete
autoload -Uz compinit
compinit
alias k=kubectl
source <(kubectl completion zsh)
compdef k='kubectl'

preinstall zsh and kubectl plugin
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы используете незаконную лицензию на продукт?... 🤡

Если вас тоже бесит эта надпись во взломанной JIRA, есть простое и элегантное решение.
#jira #crack #nginx #sub_filter #license

Меняем конфигурацию nginx, добавляем в ответ скрипт.
В секции server:
sub_filter_once on;

В location:
# данная замена будет работать, только если контент ответа не сжат
proxy_set_header Accept-Encoding "";

Также в location добавляем:
# добавляем script с заменой баннера
sub_filter '<meta charset="utf-8">' '<meta charset="utf-8"><script>document.addEventListener("DOMContentLoaded", function () { document.getElementById("license-banner-content").parentNode.remove(); });</script>';
Please open Telegram to view this post
VIEW IN TELEGRAM
📱 Ссылки на загрузку версий плагинов для Jira Data Center
#jira #data_center #plugin

(Добавить /version-history?versionHistoryHosting=dataCenter в путь плагина)
Jira Plugins for Data Center

Budgets by Tempo
Capacity Planner by Tempo
Timesheets by Tempo
EasyBi
Structure by Tempo
Gantt Charts by Tempo
Structure.Pages by Tempo
Telegram Connector for Jira
Please open Telegram to view this post
VIEW IN TELEGRAM
📱 Загрузка плагинов для Jira Data Center v9+
#jira #plugin #data_center #crack #atlassian

С версии Jira Data Center 9+ начинаются проблемы с установкой плагинов из официального маркетплейса. Точнее - он просто выключен. Но есть решение)

1️⃣ Для начала вам нужно активировать загрузку плагинов из файла, для этого остановите Jira и добавьте в environment следующий параметр:
JVM_SUPPORT_RECOMMENDED_ARGS="-Dupm.plugin.upload.enabled=true"

2️⃣ Потом запустите Jira. В разделе Управление приложениями появится кнопка Загрузить приложение.
3️⃣ Найдите на сайте маркетплейса Jira нужный плагин (например Timesheets)
4️⃣ Если плагин подходит для версии Data Center (это указано сразу под названием плагина: works with DataCenter), добавьте в адресную строку страницы следующий путь:
/version-history?versionHistoryHosting=dataCenter

Вот готовый пример.
5️⃣ Откроется история версий, с возможностью загрузить сам файл плагина, выберите нужную версию и скачайте (обычно это файл формата .jar или .obr)
6️⃣ Загрузите скачанный файл по кнопке из пункта 2️⃣.
Появится окно с установкой, после успешного завершения которой, плагин появится в списке установленных.
7️⃣ Лечение плагина. Если у вас версия Jira вылеченная с помощью atlassian-agent.jar то вам нужно зайти в контейнер с Jira (если docker) или на машине, где установлена Jira.
Далее запустить команду вида:
java -jar /crack/atlassian-agent.jar -p is.origo.jira.tempo-plugin -m some@mail.ru -n MD -o http://jira.domain.local -s BPQ1-1111-WKR6-QQ0D

Параметр -p (-p is.origo.jira.tempo-plugin) возьмите из Ключ приложения (разверните блок с приложения в списке)
Параметр -s (-s BPQ1-1111-WKR6-QQ0D) возьмите из:
Настройки > Система > Системная информация > ID Сервера
Полученный в результате запуска код вставьте в соответствующее окно в настройках плагина.
8️⃣ 🪄 Profit!
Please open Telegram to view this post
VIEW IN TELEGRAM
122
Новая политика для HTTPs репозиториев NuGet пакетов. Теперь необходимо явно указывать какие источники должны быть в исключении безопасности.
#nuget #dotnet
Для этого, в корень решения кладем файл nuget.config с таким вот содержимым:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="http-source" value="http://domain.local/nuget" allowInsecureConnections="true" />
</packageSources>
</configuration>
1❤‍🔥1
📱 Интерграция Serilog с ILogger<T>
#seriog #ilogger #log #donet #aspnet

Serilog удобен в использовании и имеет множество библиотек расширений, однако ILogger<T> за счет generic параметра обладает метаданными типа, в который был передан.

В aspnet можно легко интегрировать Serilog в ILogger<T> и продолжать использовать удобный логгер с типовым обогащением.

Пошаговая инструкция:
♠️ Установим пакеты

dotnet add package Serilog
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.AspNetCore

♠️ Настроим Logger (например, в самом начале класса Program)

Log.Logger = new LoggerConfiguration()
.WriteTo.Console(outputTemplate:
"[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} - {Message:lj}{NewLine}{Exception}"
)
.CreateLogger();

♠️ Добавим вызов UseSerilog

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog(); // <-- !!!

♠️ Теперь можем использовать ILogger<T> полученный через DI и текст логов отобразит generic тип объекта ILogger<T>:

app.MapGet("/", (ILogger<Program> logger) => {
logger.LogInformation("message: {Message}", "hello!");
return "OK";
});

// [22:16:27 INF] Program - message: hello!
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤‍🔥3
🔑 KeyInject: как я перестал бояться конфигураций

Если вы когда-нибудь сталкивались с головной болью 😱 при настройке конфигураций в своих приложениях, это точно для вас!

Всё началось с того, что я работал над микросервисным приложением. У нас было около 15 разных сервисов, и каждый имел свою конфигурацию с кучей настроек: подключения к базам данных, API-ключи, URL-адреса других сервисов и так далее.
И вот мы переезжаем из тестового окружения в продакшн, и мне нужно заменить ВСЕ эти URL-адреса и ключи во ВСЕХ конфигурациях. Я уже видел бессонную ночь с поиском и заменой, пока не наткнулся на KeyInject.

Первые шаги с библиотекой
Установка библиотеки:

dotnet add package KeyInject


И вот как я начал использовать её в своём проекте:

using Microsoft.Extensions.Configuration;
using KeyInject;

// Создаем базовую конфигурацию
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();

// Добавляем KeyInject
var configWithInjection = new ConfigurationBuilder()
.AddConfiguration(configuration)
.AddKeyInject(options =>
{
// Добавляем источник значений для подстановки
options.AddSource(configuration.GetSection("Variables"));
})
.Build();


Что меня приятно удивило
Поддержка регулярных выражений. Я мог настроить шаблоны для замены как угодно:

options.AddPattern(@"\$\{(?<key>[^}]+)\}"); // Заменяет ${key} на значение

Вложенные подстановки. Это просто магия! Я мог делать такие штуки:

{
"Variables": {
"Environment": "Production",
"BaseUrl": "https://api.${Environment}.mycompany.com"
},
"ServiceSettings": {
"ApiUrl": "${BaseUrl}/v1"
}
}


И ${BaseUrl} сначала заменится на https://api.${Environment}.mycompany.com, а затем ${Environment} заменится на Production. В итоге получим https://api.Production.mycompany.com/v1

Реальный пример из жизни
Однажды нам срочно понадобилось развернуть наше приложение в новом регионе. Раньше это означало бы часы работы по обновлению всех конфигураций. С KeyInject я просто добавил шаблон ${Region} и значение в Environment Variables машины:

{
"Variables": {
"DatabaseServer": "db-${Region}.mycompany.internal",
"StorageAccount": "storage${Region}01"
}
}

Все что нужно делать для изменение региона, это поменять значение в переменных среды! Когда через месяц нам понадобилось развернуться в другом регионе, я просто изменил значение Region на us-east и всё заработало без единой правки в основных конфигурациях.

⭐️⭐️⭐️
- Я сэкономил кучу времени на ручном обновлении конфигураций
- Уменьшил количество ошибок из-за опечаток при копировании значений
- Сделал конфигурации более понятными для новых разработчиков в команде
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Rider Regex replacement with Groups
#rider #regex #replacement #ide

Вот таким не хитрым способом можно заменять текст, с поиском по регулярным выражениям.
Главное объявить группу (использовать круглые скобки).
Выражение для поиска:

\<([a-zA-Z]+)\>\.None\(\)

Объявление группы

([a-zA-Z]+)

Использование группы в вставке (группа обозначается `$1`)

.From<$1>
❤‍🔥2