Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

.NET дайджест #36: C# 9.0, .NET 5, Apple M1, Space X for Azure

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

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

Конечно, самое главное событие осени — это релиз .NET 5. Безусловно, это великое событие в истории платформы, которое завершает развитие ветки .NET Framework, а ветка .NET Core теперь становится основной. Microsoft убрала «Core» из названия платформы и изменила версию сразу на пятую. Более не будет двух веток, а будет единый и неделимый .NET. Стоит отдать должное компании Microsoft, которая смогла очень изящно и практически незаметно для разработчиков полностью переписать огромную платформу, сохранив совместимость с большинством существующих API.

Вместе с .NET 5 стала доступна и новая версия C# 9.0. Среди особо интересных возможностей: генераторы исходного кода, записи — новый тип класса (тип класса звучит довольно неоднозначно, но лучшего термин не смог подобрать), который поддерживает иммутабельность и инструкции верхнего уровня, которые позволяют значительно упростить код для небольших приложений и сервисов.

На релиз .NET уже успели отреагировать другие крупные игроки ІТ: Amazon выпустила новую версию AWS Toolkit for Visual Studio с поддержкой .NET 5, Oracle уже подготовила свою библиотеку ODP.NET к новой версии платформы, а RedHat заявила о том, что RHEL 7, RHEL 8 и OpenShift Container Platform полностью поддерживают .NET 5.

Помимо Microsoft, отметилась громким релизом компания Apple, которая выпустила новые модели MacBook на своем собственном процессоре. Я решил провести небольшое расследование и узнать, есть ли шанс у новых устройств от Apple получить поддержку .NET?

Несмотря на то, что релиз .NET 5 — это очень важное и интересное событие, не будем обходить вниманием Azure. Недавно в Microsoft заявили о партнерстве со Space X. Совместными усилиями компаний сеть облачных вычислений Azure будет подключена к растущему спутниковому интернет-сервису Starlink. На сегодня SpaceX запустила более 800 спутников Starlink — небольшую часть от общего количества, необходимого для глобального покрытия, но этого достаточно, чтобы начать предоставлять услуги в некоторых регионах, в том числе на северо-западе США.

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

.NET

Microsoft told, ’We’re not happy’ by GitHub contributors to open-source .NET Core WPF — Microsoft заявила, что недовольна тем, как обстоят дела с .NET Core WPF. Команда Microsoft .NET Core признает, что ей необходимо лучше поддерживать участников своих проектов с открытым исходным кодом.

F# Ukraine Interview Session #1 with Vagif Abilov — интервью с Вагифом, российско-норвежским разработчиком, работающим в норвежской компании Miles. У него около трех десятилетий опыта программирования, в настоящее время он занимается созданием систем на F# и C#. Вагиф часто выступает на конференциях по программному обеспечению и участвует в некоторых проектах с открытым исходным кодом.

Introducing F# 5 — введение в F# 5.0.

Using Redis as a .NET Core Data Store — использование Redis в проектах на .NET Core.

Architecting .NET Desktop and Mobile applications — в этом руководстве представлены несколько архитектурных шаблонов, которые можно использовать для реализации общих сценариев в настольных и мобильных приложениях .NET.

Tim Deschryver — поиск утечек памяти в C#.

Understanding Disposables In .NET Dependency Injection — некоторые нюансы работы с классами, которые реализуют интерфейс IDisposable при настройке внедрения зависимостей в ASP.NET Core.

6 Best Practices to Keep a .NET Application’s Memory Healthy — шесть советов о том, как сохранить память.

Generating Code in C# — пример использования Source Generators.

Microservices with event sourcing using .NET Core — Event sourcing в .NET Core, с примерами на GitHub.

Enabling and using C# 9 features on older and «unsupported» runtimes — использование возможностей C# 9 на «неподдерживаемых» рантаймах.

Martin Björkström — Migrating WCF to gRPC — The protobuf-net way — миграция с WCF на gRPC.

Developing a Lightweight TUI Music Player in C# using Terminal.Gui (Part One) — как написать свой консольный медиаплеер на C#.

Algorithms and Data Structures in C# — сайт, посвященный изучению и имплементации алгоритмов и структур данных на языке C#.

Use ASP.NET With Turbolinks 5 — прокачайте свой ASP.NET веб-сайт с помощью TurboLinks!

Introducing DotNet.SystemCollections.Analyzers — библиотека DotNet.SystemCollections.Analyzers, которая дает возможность разработчикам принимать более эффективные решения с помощью набора микрооптимизаций.

When does Blazor decide to render your UI? — статья будет полезна для тех, кто работает с Blazor. Автор рассказывает о том, как устроен рендеринг UI в Blazor.

Use System.IO.Pipelines and System.Threading.Channels APIs to Boost Performance — увеличение производительности с использованием возможностей System.IO.Pipelines и System.Threading.Channels.

По мотивам youtube-dl — как написать загрузчик музыки на C#.

Защита .NET-кода от реверс-инженеринга с помощью ConfuserEx 0.6.0 — хорошему программисту обфускатор не нужен — он сразу пишет обфусцированный код. Но все же, если вы пока не дошли до такого уровня мастерства написания кода, то эта статья для вас.

Ленивая инициализация в C# — про то, чем хороша отложенная инициализация и как ее реализовать.

Представляем .NET Live TV — ежедневные лайв-стримы для разработчиков — то, о чем вы всегда мечтали, произошло! Вам больше не нужна подписка на Netflix, вы можете выкинуть ваш телевизор и отключить спутник. Ведь теперь есть .NET TV!

Отлаживайте ваши приложения .NET Core в WSL 2 с Visual Studio — преимущества отладки .NET Core проектов с использованием WSL 2.0 и Visual Studio.

.NET в целом: обзор от Скотта Хансельмана — обзор .NET от Скотта Хансельмана — одного из самых значимых специалистов в мире .NET.

mj1856/TimeZoneConverter — вышла новая версия TimeZoneConverter. Это библиотека для быстрого преобразования между часовыми поясами IANA, Windows и Rails. TimeZoneConverter.Posix также добавляет поддержку часовых поясов POSIX, которые полезны при работе с IoT.

KorzhCom/EasyData — вышел EasyData 1.1! EasyData — это библиотека с открытым кодом для проектов на ASP.NET Core + Entity Framework Core, которая позволяет получить полную CRUD-функциональность лишь за несколько строк кода. EasyData использует декларативный подход: все формы и диалоги генерируются автоматически при выполнении с помощью информации из вашего DbContext.

What’s new in C# 9.0 — тезисно про нововведения в C# 9.0.

New Features in Visual Studio 2019 v16.8 Preview 3.1 — новые возможности Visual Studio 2019.

The future of .NET Standard — релиз .NET 5 произойдет уже очень скоро. Помимо изменений в самом .NET, нас ждут изменения, связанные с .NET Standard.

Game Development with .NET — знаете и умеете .NET, давно хотели заняться гейм-девелопментом, но считали, что столь серьезная платформа не рассчитана на создание игр? Ребята из Microsoft готовы показать вам, что это не так.

gRPC performance improvements in .NET 5 — в .NET 5 нас ждет ряд улучшений при работе с gRPC.

Announcing ASP.NET Core in .NET 5 — ASP.NET в .NET 5.

Reactive Programming: Hot Vs. Cold Observables — шаблон «наблюдатель» лежит в основе реактивного программирования. Наблюдаемые объекты бывают двух видов: горячие и холодные. В этой статье объясняется, как определить разницу между ними. Основное внимание уделяется горячим объектам. Приведенные здесь концепции относятся ко всем языкам, поддерживающим реактивное программирование.

ILogger and Null Object Pattern — применение Null Object паттерна при логировании.

C#9 records: immutable classes — record — это давно ожидаемая возможность, которую теперь предлагает C# 9! Тип record предназначен для удобного создания неизменяемых структур.

Test-driving C# Source Generators — пример реального использования Source Generators.

Moving away from Visual Studio to JetBrains Rider — миграция с Visual Studio на Rider.

Astonishing Performance of .NET 5 — .NET 5 стал гораздо производительнее.

Azure

Azure + Spring Boot = Serverless — Q&A with Julien Dubois — особенности работы Java и Spring Boot в облаке Azure.

New for Blazor: Azure Static Web Apps Support — в Azure Static Web Apps появится поддержка Blazor.

Ignite 2020: New serverless and analytics capabilities announced — новые возможности Cosmos DB.

Azure and Application Development news with Julia White and Frank Shaw — новости Azure и разработки приложений с Джулией Уайт и Фрэнком Шоу.

Collect and Automate Diagnostic Actions with Azure App Services — диагностика Azure App Services.

Microsoft построит в Украине два дата-центра — очень крутая новость: в Украине будет построено два новых дата-центра Microsoft.

How to add and secure a custom domain on your App Service web app — в этом видео вы узнаете о том, как привязать доменное имя к веб-приложению, и о том, как защитить свой домен с помощью управляемого сертификата службы приложений.

Обучающие вебинары по Microsoft Azure с субтитрами на русском в ноябре — подборка отличных обучающих материалов.

.NET 5 now available in App Service — NET 5 теперь поддерживается Azure App Services.

Статические веб-приложения Azure с .NET и Blazor — сегодня в статических веб-приложениях Azure реализована первоклассная поддержка Blazor WebAssembly и .NET Functions в ознакомительной версии во всех регионах ее действия. Это было одним из ключевых запросов пользователей с момента объявления о выпуске статических веб-приложений на конференции Build. Вы можете разрабатывать и развертывать клиентские и бессерверные API-интерфейсы, созданные полностью на языке .NET.

Xamarin

Build Xamarin.iOS apps using iOS 14 and Xcode 12 — iOS 14 уже ушла в релиз, поэтому стоит посмотреть, что предлагает Xamarin для лучше интеграции ваших приложений с новой версией мобильной ОС от Apple.

Replicating User Profile UI — на этой неделе к Джеймсу присоединяется Леомарис Рейес, MVP Microsoft, который шаг за шагом проведет нас через создание красивого пользовательского интерфейса с помощью Xamarin.Forms.

Xamarin.Forms 5 Is Here! — новый релиз Xamarin.Forms 5.0! В него вошли последние релизы Brushes, CarouselView, Drag & Drop, RadioButton, Shapes и многое другое.

Xamarin.Forms 5: Beautiful and Fast Apps with Less Code — Xamarin.Forms 5 получил ряд новых возможностей, которые упрощают разработку быстрых, красивых и кроссплатформенных приложений.

Recapping Xamarin Highlights from .NET Conf 2020 — главные ананасы по Xamarin с недавно прошедшей .NET Conf 2020.

Data Science

ML.NET September Updates — новый выпуск ML.NET содержит множество улучшений, включающих возможность обучения моделей обнаружения объектов с помощью Azure ML и Model Builder. Теперь вы можете локально обучать модели классификации изображений с помощью интерфейса командной строки ML.NET.

Новейшая технология Microsoft, появившаяся в Azure AI, описывает изображения так же хорошо, как и люди — исследователи из Microsoft создали систему искусственного интеллекта, способную генерировать подписи к изображениям, которые во многих случаях оказываются более точными, чем описания, сделанные людьми. Этот прорыв стал важной вехой в стремлении Microsoft сделать свои продукты и услуги инклюзивными и доступными для всех пользователей.

Послесловие

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


Чтобы не пропустить ничего до выхода следующего выпуска — следите за новостями про .NET, Azure, Xamarin в телеграме. Все технические публикации ДОУ читайте здесь.


Предыдущие выпуски

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному4
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Андрей, спасибо за дайджест! Много чего пропустил, на самом деле.

О, привет Женя! Приятно видеть, что и ты читаешь!

Microservices with event sourcing using .NET Core — Event sourcing в .NET Core, с примерами на GitHub.

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

— оптимистичная конкуренция в коде(ее должно поддерживать само хранилище, операция должна быть атомарной, читайте Грэга Янга),
— выброс ошибок домена сразу вызывает печаль:
throw new Exception($"Version ’{expectedVersion.Value}’ already exists for stream ’{aggregateId}’"); судя по рекомендациям в недавней статье про 150 вопросов на .net интервью автор дайджеста не прошёл был на мидла даже с таким дайджестом, либо не читаете, что постите.
— консистентность состояния системы event store, broker — оно там не консистентно(ее вообще нет), пишется в разных транзакциях и не атомарно.

Хорошие статьи на счет event sourcing и микросервисы с примерами кода, где все это продуманно и на уровне консистетности данных, расширяемости и на уровне нюансов, о которых писал Эванс
www.linkedin.com/...​ion-part-1-stefano-rocco
www.linkedin.com/...​ion-part-2-stefano-rocco
www.linkedin.com/...​chitecture-stefano-rocco

Спасибо за подробный разбор и ссылки!

Статьи просто бомбовые и, наверное, самые лучшие, которые встречал по теме — человек проделал действительно огромную работу по систематизации большинства юз-кейсов по дизайну. Странно, что я за 3 года вижу эти статьи первый раз, и они не очень-то залайканные/раскрученные.

Оптимистичная конкуренция на уровне хранилища? Это же где такое старина Эванс говорил, ссылочку не дадите? Вот собственно его канонический код: github.com/...​/SimpleCQRS/EventStore.cs
Он просто привел пример как резолвить с помощью данного подхода конфликты при сторе аггрегатов в ивэнт сторе. Сам по себе Conflict Detection and Resolution это прерогатива ORM-мапперов, которые уровень абстракции над хранилищем. Либо же кастомная логика в коде. RDBMS имеет ACID для гарантии изолированности, атомарности и консистентности транзакций. Если пишете на T-SQL то да, он транзакционен, C# или например JavaScript нет. Так что разруливать конфликты будете так или иначе в коде. Некоторые NoSQL базы аля RavenDB или CosmosDB помогают с конкуренцией тем что сторят etags вместе с документом и на уровне драйвера/пакета/либы/маппера имеют более удобные конструкции для резолюции блокировок.

Самое главное требование что бы оптимистичная конкуренция работала — эта проверка должна работать с блокированием данных для других читающих текущую ревизию, это можно сделать транзакционностью(sql — repeatable reads/updlock — можно делать в c#/js вызывая DB api), а там где ее нет — атомарностью операции такой проверки(в Mongo, например, это делаеться путем того, что обновление документа атомарно и там есть возможность писать update .. where ..). Впринципе оптимистичную конкуренцию можно сделать с большим количеством различных хранилищ и языков отталкиваясь от их возможностей(а не только там где оно работает из коробки или для субд с транзакциями).

Это требование логично само по себе, оптимистичная конкурентность предполагает решение конфликта без потери данных, если в коде просто вычитать что-то и сделать проверку без поддержки ивент стора этих механизмов в ивент сторе полезут дубликаты по ревизиям(говоря попросту такой optimistic concurrency вообще не будет работать).

Это же где такое старина Эванс говорил, ссылочку не дадите?

Только не Эванс, а Грэг Янг — раз мы уже говорим про event sourcing и вы на него ссылаетесь.
cqrs.files.wordpress.com/...​010/11/cqrs_documents.pdf
The write operation is also relatively simple though there are a few subtleties to be found within it. The
basic narrative is that it first checks to see if an aggregate exists with the unique identifier it is to use, if
there is not one it will create it and consider the current version to be zero. It will then attempt to do an
optimistic concurrency test on the data coming in if the expected version does not match the actual
version it will raise a concurrency exception. Providing the versions are the same, it will then loop
through the events being saved and insert them into the events table, incrementing the version number
by one for each event. Finally it will update the Aggregates table to the new current version number for
the aggregate. It is important to note that these operations are in a transaction as it is required to insure
that optimistic concurrency amongst other things works in a distributed environment.

и вот еще тоже пишет людям, которые пытаються делать тоже самое за что вы спрашиваете, не разобравшись в основах конкуретного программирования.
github.com/...​77#issuecomment-497760600

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

Здесь уже противоречение, она ж на то оптимистичная что ничего не блочится до самого последнего момента. Ну а конфликты всё равно на уровне приложения прийдётся разруливать, когда optimistic check не сработает. Хранилище ж понятия не имеет что делать с разными состояниями агрегата, тем более состояние одного из них может быть уже само по себе неактуальным, так как вычислялось на основе устаревших данных.

Имхо, optimistic check чаще не нужен чем нужен, проще сделать просто pessimistic lock на запись для агрегата перед самым его получением для изменения — надёжно, не нужно заново актуализировать состояние агрегата в приложении и его вычислять в случае optimistic check = fail, всё равно в большинстве случаев смерджить мы никак не сможем.

Грэг Янг, конечно голова, но мне кажется он описывал «фреймворк/flow» для любого абстрактого случая, но в частностях имеет смысл отходить от догм.

Здесь уже противоречение, она ж на то оптимистичная что ничего не блочится до самого последнего момента.

Данные не блочатся, проверка ревизии должна происходить атомарно или транзакционно — тут нет противоречия.

Имхо, optimistic check чаще не нужен чем нужен, проще сделать просто pessimistic lock на запись для агрегата перед самым его получением для изменения — надёжно, не нужно заново актуализировать состояние агрегата в приложении и его вычислять в случае optimistic check = fail, всё равно в большинстве случаев смерджить мы никак не сможем.

Оптимистичная конкуренция являеться надежным механизмом гарантирования целостности данных без необходимости их блокирования при чтении юзером от начала и до конца сессии(pessimistic). Попробуйте смоделировать предотвращение потери описания продукта(названия скажем), когда это описание одновременно изменяется в админке (обычный веб сайт) несколькими пользователями и расскажите подробней как в этом поможет

сделать просто pessimistic lock на запись для агрегата перед самым его получением для изменения

то что я вижу вы просто поочереди запишите изменения и потеряете изменения внесенные первые админом. это называеться last write wins — а то что вы пишете говорите о том что вы не понимаете как работает механизмы optimistic/pessimistic concurrency;

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

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

это называеться last write wins

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

Кейсы:

1. Люди пишет клиенты к товару, и мы в агрегате хотим иметь количество/счётчик клиентов.

2. Списание с баланса пользователя, где нужно по хитрой логике высчитать скидку, проверить хватит ли денег и если ок, то сохранить событие и обновить баланс.

3. Какой-то донат с лимитом. Каждый может задонатить 1 цент, но общая сумма чтоб не превышала N долларов.

Зачем в этих случаях оптимистическая блокировка? Нам нужно изменить агрегат, на основе самых актуальных данных, в случае positive check false нужно вычитать актуальные данные, опять применить логику и попытаться сохранить и смысл? Хотя лока агрегата перед началом операции достаточно.

вы не понимаете как работает механизмы optimistic/pessimistic locking

вот давайте не вешать ярлыков.

Люди пишет клиенты к товару

«Коменты», конечно, не клиенты. Автоподстановка )

Коментар порушує правила спільноти і видалений модераторами.

priscree.ru/img/ac3f49ab736584.png
Говорите приставку Core убрали? А почему я ее вижу только при создании нового проекта в 10-ти местах на экране? Если что вижуалстудию снес, и скачал после релиза чистую уже c .NET 5

Чтобы не было ко-ко-ко, у меня все сломалось. Наверное, к следующей LTS версии поменяют названия пространств имен, билиотек и т.п. Пока это только название фреймворка, моникеров и т.п.

Хотя, может, Core только в ASP.NET Core остался и его пока не переименовывали, только .NET.

Мы забили и переехали. EAP довольно стабильно работает.

Тоже сейчас на EAP. Все круто кроме того, что под macOS в полноэкранном режиме диалоговые окна иногда начинают глючить и растягиваются на полный экран. При этом создаётся новый виртуальный десктоп. Хотя может это баг новой макоси, а не райдера. Пока не очень понятно — обновил и то и другое примерно в одно время.

Я видноузятник, но буквально несколько дней назад вышел новый EAP twitter.com/...​tatus/1332310266491629568, может там эти проблемы пофиксили? Вообще у меня JetBrains Toolbox настроен на автоматические обновления, в том числе и до EAP, поэтому меня слегка удивило, когда некоторые ребята в команде начали писать, что Rider не поддерживает .NET 5 🙂. Вроде пока громко никто не жаловался.

А еще понаставляют себе эти линуксы и докеры и чпокаются с ними.

Но ведь отличная IDE, а по некоторым функциям превосходит VS как тот же code comparer — насколько он убогий в студии, и насколько он прекрасный в райдере. Интеграция с git-ом тоже куда приятнее. Работа с тестами тоже на 2 головы выше чем у студии, тесты в студии вообще часто сходу не заводятся, приходится дополнительные плагины/пакеты устанавливать.

Вообще выглядит он более user friendly, студия хоть и функциональная, но от нее несет энтерпрайзом. Складывается такое впечатление, что VSCode скоро студию обгонит, насколько быстро он развивается.

Проапгрейдил один из своих проектов до .net 5, но из коробки пока что не было доступно билд-деплой для этой версии. Плюс если проект деплоится не в докере а просто напрямую в web app то нужно создавать новую версию web app для .net 5 в preview версии пока что. В билд пайплайне в azure devops пришлось вручную устанавливать sdk, потому что текущие агенты его не поддерживают.
Но в целом все собралось, задеплоилось и работает.

Это в Azure? У меня сразу в существующем web app появилась опция .NET 5

да, для существующего оно мне давало выбор только из .NetCore 2 / .NetCore 3

Как обстаят дела с десктопом на просторах дотнета? Помер или ещё трепыхается?

Avalonia везде есть, вплоть до mobile. И это практически WPF по фичам.

403 Forbidden — очень крутая новость: в Украине будет построено два новых дата-центра Microsoft.

А что значит тут «403 Forbidden»?

Интересно, это вы как-то автоматизированно собираете ссылки в 1 документ, что робот получил ответ 403 и вставил в текст?

Да, я материал весь интересный сохраняю в свою БД и там же сразу страница парсится и сохраняется в отдельную колонку заголовок. Вот тут я рассказывал о том, как это для проекта devdigest работает: andrew.gubskiy.com/events/item/3

Спасибо, посмотрел презентацию, я себе сначала представлял что-то более простое типа букмарклета или ifttt.com

Підписатись на коментарі