NeuroLook
رفتن به کانال در Telegram
1 669
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-37 روز
-1130 روز
آرشیو پست ها
1 669
+2
🖥 Как запустить C# юнит-тесты на Linux в GitHub Actions?
В этой статье мы разберёмся с запуском C#-тестов на Linux и последующую публикацию их в открытом репозитории кода на GitHub.
План:
├╼ Устанавливаем .NET на Ubuntu 22.04
├╼ Создаём проект
├╼ Запускаем сборку в GitHub Actions
├╼ Используем секреты в коде тестов
╰╼ Размещаем секреты в GitHub Actions Secrets
📎 Туториал
🖥 GitHub1 669
🖥 Как можно реализовать ограничение на одновременное скачивание файлов?
▶️Итак, есть сервис, который отдает пользователям видео файлы, реализован метод для скачивания файла, который отдает файл через метод
File:
[HttpGet("file/{guid}/download")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<IActionResult> DownloadFile([FromRoute] Guid guid)
{
var file = await _mediaContentService.DownloadFile(guid);
return File(file.Stream, file.ContentType, file.FileName);
}
Можно ли каким-либо образом реализовать ограничение на скачивание файла, чтобы, например, в единицу времени не больше N пользователей качало файл?
▶️Проблема с методом File — он возвращает ленивый ответ. Т.е. он не читает весь поток сразу, а ждет пока будет вызван метод от IActionResult.
Чтобы эту проблему решить, надо знать, когда файл точно отправлен.
Можно сделать специальный декоратор. Например:
[ApiController]
[Route("[controller]")]
public class SampleController : ControllerBase
{
private readonly IRateLimiter _rateLimiter;
public SampleController(IRateLimiter rateLimiter)
{
_rateLimiter = rateLimiter;
}
[HttpGet("connection")]
public async Task<IActionResult> DownLoadFile(Guid file)
{
var stream = await GetFileStream(file);
return new RateLimiterFileActionResult(File(stream, "content/type", "sample.txt"), _rateLimiter);
}
}
class RateLimiterFileActionResult : IActionResult
{
private readonly IActionResult _actionResultImplementation;
private readonly IRateLimiter _rateLimiter;
public RateLimiterFileActionResult(IActionResult actionResultImplementation, IRateLimiter rateLimiter)
{
_actionResultImplementation = actionResultImplementation;
_rateLimiter = rateLimiter;
}
public async Task ExecuteResultAsync(ActionContext context)
{
try
{
await _rateLimiter.ObtainAsync(context.HttpContext.RequestAborted);
await _actionResultImplementation.ExecuteResultAsync(context);
}
finally
{
await _rateLimiter.ReleaseAsync(context.HttpContext.RequestAborted);
}
}
}
public interface IRateLimiter
{
public Task ObtainAsync(CancellationToken token);
public Task ReleaseAsync(CancellationToken token);
}
Стоит заметить, что блокировка берётся внутри метода декоратора, а не в методе контроллера.1 669
🖥 Чем out отличается от ref?
▶️Функция с параметром с ключевым словом
out даёт такой же результат, как и с ref.
Такой код:
private void func(out string value)
{
value = "Hello World!";
}
Даёт такой же эффект, как и:
private void func(ref string value)
{
value = "Hello World!";
}
В чём же разница между out и ref?
▶️Разница в том, что out — это выходной параметр, а ref — входно-выходной.
Для ref-параметра вы должны передать его инициализированным, и можете пользоваться его исходным значением. А для out-параметра вы не обязаны инициализировать его перед вызовом функции, не можете использовать его значение в функции до присваивания, и обязаны инициализировать его в функции.
(Таким образом, ref-параметр немного напоминает инициализированную локальную переменную, а out-параметр — неинициализированную.)
Иллюстрация:
private void func1(out string value)
{
Console.WriteLine(value); // нельзя, value не инициализировано
if (false)
return; // нельзя, забыли установить знач...1 669
🖥 Пишем на C# программу для поиска файлов, используя ProgressBar и BackgroundWorker
Если вы хотите глубже разобраться, как работать с элементами ProgressBar и BackgroundWorker в C#, с элементом FolderBrowserDialog, а также с событиями DoWork, ProgressChanged, RunWorkerCompleted, то большая часть этой статьи может принести вам много нового опыта.
Уверен, будет полезно)
Будущее приложение по поиску файлов будет выглядеть как на изображении
📎 Пошаговая реализация программы
1 669
🖥 Что лучше, возвращать null, или пустую коллекцию?
▶️Если возвращаемый тип — коллекция, что лучше: возвращать
null или пустую коллекцию? Есть ли общепринятая практика?
▶️Вопрос здесь в семантике.
На запрос «дайте мне список всех пользователей» пустая коллекция имеет очевидный смысл: «окей, вот вам список всех пользователей, их ровно 0 штук».
С другой стороны, возвращённый null может означать что угодно: «я не знаю, сколько пользователей», «количество пользователей ещё не подсчитано», «текущая база данных вообще не имеет понятия пользователь», что угодно.
То есть смысл пустой коллекции всегда ясен, смысл null не определён.
▶️Ещё одна причина возвращать пустые коллекции, а не null — так вы избавите пользователя от необходимости писать утомительный код проверок на null и, соответственно, избавите его от большого количества NullReferenceException, если он таковой код написать забыл. Хорошим примером могут быть случаи, когда коллекции задействованы в цепочках методов вида
var res = FirstMethod().SecondMe...
1 669
🖥 Event и delegate: в чем отличие?
Начнём с того, что
event и delegate — это 2 абсолютно разных вещи. Разница между полем-делегатом и event'ом примерно такая же, как между полем и свойством: event иногда выглядит как делегатное поле. Давайте разберёмся в этом.
⏩delegate — это класс, содержащий в себе «шаблон» метода, то есть, сигнатуру метода. Переменная делегатного типа — объект типа MulticastDelegate (точнее, производного от него), который может содержать один или несколько объектов, представляющих собой методы с совместимой с «шаблоном» сигнатурой (контр- и ковариантность немного усложняет картину). То есть это как бы переменная, которая может содержать функции. Для таких переменных определена операция +, которая комбинирует слагаемые-функции в одну новую функцию, и симметричная операция -. Эти операции автоматически порождают производные операции += и -=.
⏩event же — это просто пара методов в классе, обозначаемых как add и remove, и имеющих произвольную семантику, выбранную программистом. (Аналог — ...1 669
😎Хотите освоить систему контроля версий git и улучшить свои навыки разработки на С#?
💪Приходите на бесплатный практический урок «Система контроля версий git» от OTUS. Спикер — опытный Fullstack-разработчик на стеке C#(.NET) и Javascript (React).
👨🏫На вебинаре вы изучите основные понятия и операции git, которые помогут вам эффективно управлять версиями вашего кода и начать успешную карьеру в программировании! Занятие подойдет новичкам и продолжающим разработчикам на С#.
🥉Урок пройдет 23 апреля в 20:00 мск и будет приурочен к старту большого курса «Специализация C# Developer». После вебинара вы получите специальную цену на обучение и персональную консультацию от наших менеджеров!
💯Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок: https://clck.ru/3A7HQh
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
1 669
🖥 Visual Studio 17.10 получит унифицированный интерфейс Copilot, объединяющий функции Copilot и Copilot Chat
⏩Microsoft объявила, что Visual Studio 17.10, выход которой запланирован на май, получит унифицированный интерфейс Copilot, объединяющий функции Copilot и Copilot Chat в одном пакете. Это должно устранить необходимость установки двух отдельных расширений и позволит «глубже интегрировать в приложение возможности искусственного интеллекта».
⏩Ознакомиться с новым унифицированным интерфейсом можно в версии Preview 3 по подписке GitHub Copilot.
1 669
🖥 Avalonia UI — система для разработки мультиплатформенных приложений с помощью .NET
⏩Avalonia - это открытая, кроссплатформенная графическая система отображения. Она входит в .NET Foundation и является одним из самых активных проектов сообщества в области IT. Она используется для создания продвинутых и красивых интерфейсов. Avalonia поддерживает множество платформ, включая Windows, Linux, macOS, iOS, Android и WebAssembly.
⏩Созданная на современном стеке .NET, Avalonia позволяет использовать любой язык из семейства .NET (C#, F#, Visual Basic) и язык разметки XAML для определения интерфейса. Подобно WPF, Avalonia использует систему стилей на основе XAML, а ее система компоновки и привязки данных предоставляет знакомую среду для разработчиков, имеющих опыт работы с фреймворками, основанными на XAML.
⏩Ключевым отличием Avalonia от других графических систем является отсутствие привязки к графическим элементам операционной системы. Вместо этого используются собственные элементы, обеспечивающие гибкость и вы...
1 669
🖥Ускоряем Dictionary в C# при помощи структур и CollectionsMarshal
Как C# разработчик, вы по-любому знаете класс
Dictionary. В качестве значений вы, скорее всего, использовали классы.
А знаете ли вы, что в Dictionary можно использовать структуры? Не стоит бояться того, что структуры копируются при передаче в метод или возврате из него. Есть способ этого избежать, и это работает быстро.
Собственно, об этом и говорится в статье, а вот некоторые выводы из неё:
🟡Структуры — недооценённые элементы C#, которые, при определённых условиях, способны ускорить ваше приложение.
🟡При использовании структур в качестве значений для Dictionary лучше воспользоваться классом CollectionsMarshal.
🟡Методы этого класса GetValueRefOrAddDefault и GetValueRefOrNullRef позволяют получать элементы словаря по ссылке. Это, в свою очередь, может положительно сказаться на производительности кода при относительно большом количестве операций поиска в словаре.
📎 Статья1 669
🔥Подборка лучших обучающих каналов для программистов.
➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять
⚡Машинное обучение
Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат
🏆 Golang
Golang - изучи один из самых перспективных языков на ит-рынке
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест
💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность
🚀 Data Science
Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data
🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных
#️⃣C#
С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа
🐍 Python
Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги
☕ Java
Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги
💻 C++
C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии
⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend
🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов
📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки
🇬🇧 Английский для программистов
🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence
🔥 DevOPs
Devops для программистов
Книги Devops
🌟 Docker/Kubernets
Docker
Kubernets
📓 Книги
Библиотеки Книг для программситов
💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
1 669
🖥 10 простых и не очень однострочников на C#
⏩Удваивание всех чисел в списке
Print("Multiple each item in a list by 2", Enumerable.Range(1, 10).Select(i => i * 2));
⏩Сумма списка чисел
Print("Sum a list of numbers", Enumerable.Range(1, 1000).Sum());
⏩Проверка вхождения подстроки
var wordlist = new[] { "C#", "and stuff" };
var tweet = "This is an example tweet talking about C# and stuff";
Print("Verify if a word exists in string", wordlist.Any(word => tweet.IndexOf(word) > -1));
Print("Show matched words in string", wordlist.Where(word => tweet.IndexOf(word) > -1));
⏩Чтение файла
Print("Read in a File", File.ReadAllBytes("oneliners.exe").Length);
⏩С днём рожденья
Print("Happy Birthday", Enumerable.Range(1, 4).Select((i) => string.Format("Happy Birthday {0} ", i == 3 ? "dear NAME" : "to You")));
⏩Фильтрация списка чисел
var passed = new List<int>();
var failed = new List<int>();
(from bucket in new[] { passed, failed } from i in new[] { 49, 58, 76, 82, 88, 90 } select new...1 669
Бесплатный курс для middle C#-разработчиков от Ozon
На курсе Route 256 инженеры Ozon расскажут про самые современные технологии, а также поделятся своим опытом разработки микросервисов.
Будут лекции, воркшопы, код-ревью домашних заданий и профессиональное комьюнити. Курс рассчитан на разработчиков с опытом от 3 лет, в конце Ozon предлагает офферы лучшим выпускникам.
Чтобы попасть на курс, нужно пройти отборочный контест 5 мая.
Узнать подробности и подать заявку
1 669
🖥 Необходимо определить делегат и реализовать метод
⏩Итак, вот задание:
определить делегат
bool CounterHashSetDelegate(int a) и реализовать метод int Function12(HashSet<int> intSet, CounterHashSetDelegate filter), который возвращает количество элементов из intSet, которые удовлетворяют условию filter.
public static class
{
public delegate bool CounterHashSetDelegate(int a);
public static int Function12(HashSet<int> intSet, CounterHashSetDelegate filter)
{
int count = 0;
foreach (int i in intSet)
{
if(filter(i))
count++;
}
return count;
}
}
⏩Давайте сразу к сути, решение может выглядеть так:
public delegate bool CounterHashSetDelegate(int a);
class Program
{
static void Main(string[] args)
{
CounterHashSetDelegate d = IsEvenNum;
Console.WriteLine($"Количество четных элементов:{Function12(new HashSet<int> { 1, 2, 3, 4, 5 }, d)}");
d = IsGreaterThen;
Console.WriteLine($"Количество элементов > 2:{Functi...1 669
🖥 Блеск и нищета паттерна «Спецификация» в С#. Оцениваем планы запросов
⏩Держите годный контент. О чём статья?
О паттерне «Спецификация», который позволяет улучшить структуру приложения, и, следовательно, увеличить гибкость, уменьшив при этом объем кода, а значит - сократить количество ошибок, но это не точно.
⏩Из статьи напрашивается такой очевидный вывод: паттерн «Спецификация» выгоднее всего использовать там, где модели состоят из нескольких десятков или сотен полей и к ним нужно применять сложные критерии фильтрации данных.
📎 Статья
1 669
Добавьте в свое портфолио кейс по решению задачи с микросервисной архитектурой бесплатно и всего за пару часов
На практическом уроке «Масштабируемая архитектура для систем обработки платежей».
На вебинаре:
- рассмотрим решение задачи по построению масштабируемой отказоустойчивой системы обработки платежей;
- обсудим применения шардирования, паттерна Saga, двухфазного коммита и выбор уровня изоляции транзакций;
- получим описание верхнеуровневой архитектуры.
Занятие пройдёт 24 апреля в 20:00 мск в рамках курса «Microservice Architecture». Доступна рассрочка на обучение!
👉 Чтобы посетить открытый урок, зарегистрируйтесь: https://otus.pw/LG6se/?erid=LjN8KC4V4
