Forwarded from Библиотека девопса | DevOps, SRE, Sysadmin
📖 ТОП-10 книг, без которых не обойтись ни одному программисту
Мы подготовили для вас подборку из 10 книг, без которых не обойтись ни одному профессионалу в IT. Эти книги станут для вас настольными на долгие годы.
🔗 Основной сайт
🔗 Зеркало
Мы подготовили для вас подборку из 10 книг, без которых не обойтись ни одному профессионалу в IT. Эти книги станут для вас настольными на долгие годы.
🔗 Основной сайт
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека шарписта | C#, F#, .NET, ASP.NET
🤩 Хотите по-настоящему погрузиться в ASP.NET Core? Тогда ловите порядка пятисот практических примеров использования большинства низкоуровневых API для ASP.NET Core 6.0, 7.0 и 8.0 Preview 7 (а также 2.1, 2.2, 3.1 и 5.0).
🔗 GitHub
🔗 GitHub
GitHub
GitHub - dodyg/practical-aspnetcore: Practical samples of ASP.NET Core 10 Preview 5, 9, 8.0, 7.0, 6.0, 5.0, 3.1, 2.2, and 2.1,projects…
Practical samples of ASP.NET Core 10 Preview 5, 9, 8.0, 7.0, 6.0, 5.0, 3.1, 2.2, and 2.1,projects you can use. Readme contains explanations on all projects. - dodyg/practical-aspnetcore
Forwarded from Библиотека шарписта | C#, F#, .NET, ASP.NET
🚀System Design 101
Готовитесь к собеседованию по проектированию систем или просто хотите понять принцип работы сложных систем? Тогда репозиторий ByteByteGo точно для вас.
👉 GitHub
Готовитесь к собеседованию по проектированию систем или просто хотите понять принцип работы сложных систем? Тогда репозиторий ByteByteGo точно для вас.
👉 GitHub
🐳🚢 Настройка локального Docker Registry + Mirror Cache
#docker #registry #mirror
📕 Читать тут: ссылка Telegraph
#docker #registry #mirror
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegraph
Настройка локального Docker Registry + Mirror Cache
Если нам необходимо иметь локальный сервер образов Docker в нашей сети, или мы хотим ускорить загрузку образов с сервером Docker для ускорения сборки (например образ dotnet sdk 8.0 весит около 300 Мб) нам необходимо настроить свой registry. Сделаем это на…
🗺 Настраиваем маппинг в объявлении типа (AutoMapper Extension)
#type #automapper #mapping #dotnet
📱 Github
https://github.com/hamaronooo/KutCode.AutoMapper.Extensions
#type #automapper #mapping #dotnet
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
GitHub
GitHub - noncommunicado/KutCode.AutoMapper.Extensions: Comfortable In-Type Map Profile Configuration
Comfortable In-Type Map Profile Configuration . Contribute to noncommunicado/KutCode.AutoMapper.Extensions development by creating an account on GitHub.
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
👍 Отличная библиотека для работы с консолью Dotnet
#dotnet #console #nuget
https://spectreconsole.net/widgets/table
#dotnet #console #nuget
https://spectreconsole.net/widgets/table
spectreconsole.net
Spectre.Console - Table
Tables are a perfect way of displaying tabular data in a terminal. *Spectre.Console* is super smart about rendering tables and will adjust all columns to fit whatever is inside them.
Вы используете незаконную лицензию на продукт?...🤡
Если вас тоже бесит эта надпись во взломанной 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 #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 #plugin #data_center #crack #atlassian
С версии
Jira Data Center 9+
начинаются проблемы с установкой плагинов из официального маркетплейса. Точнее - он просто выключен. Но есть решение)environment
следующий параметр:JVM_SUPPORT_RECOMMENDED_ARGS="-Dupm.plugin.upload.enabled=true"
Управление приложениями
появится кнопка Загрузить приложение
.Data Center
(это указано сразу под названием плагина: works with DataCenter), добавьте в адресную строку страницы следующий путь:/version-history?versionHistoryHosting=dataCenter
Вот готовый пример.
.jar
или .obr
)Появится окно с установкой, после успешного завершения которой, плагин появится в списке установленных.
Далее запустить команду вида:
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 Сервера
Полученный в результате запуска код вставьте в соответствующее окно в настройках плагина.
Please open Telegram to view this post
VIEW IN TELEGRAM
1 2 2
Новая политика для HTTPs репозиториев NuGet пакетов. Теперь необходимо явно указывать какие источники должны быть в исключении безопасности.
#nuget #dotnet
Для этого, в корень решения кладем файл
#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
#translation #read
https://github.com/noncommunicado/cupid
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - noncommunicado/cupid: Перевод статьи https://dannorth.net/cupid-for-joyful-coding
Перевод статьи https://dannorth.net/cupid-for-joyful-coding - noncommunicado/cupid
3 4 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 я просто добавил шаблон
Все что нужно делать для изменение региона, это поменять значение в переменных среды! Когда через месяц нам понадобилось развернуться в другом регионе, я просто изменил значение Region на us-east и всё заработало без единой правки в основных конфигурациях.
⭐️ ⭐️ ⭐️
- Я сэкономил кучу времени на ручном обновлении конфигураций
- Уменьшил количество ошибок из-за опечаток при копировании значений
- Сделал конфигурации более понятными для новых разработчиков в команде
Если вы когда-нибудь сталкивались с головной болью
Всё началось с того, что я работал над микросервисным приложением. У нас было около 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
Вот таким не хитрым способом можно заменять текст, с поиском по регулярным выражениям.
Главное объявить группу (использовать круглые скобки).
Выражение для поиска:
Объявление группы
Использование группы в вставке (группа обозначается `$1`)
#rider #regex #replacement #ide
Вот таким не хитрым способом можно заменять текст, с поиском по регулярным выражениям.
Главное объявить группу (использовать круглые скобки).
Выражение для поиска:
\<([a-zA-Z]+)\>\.None\(\)
Объявление группы
([a-zA-Z]+)
Использование группы в вставке (группа обозначается `$1`)
.From<$1>
❤🔥2