• CLRium #6: 9 дней до старта

      29-30 ноября в Санкт-Петербурге и 06-07 декабря — в Москве мы запустим шестой семинар по .NET. У нас будет: 700 слушателей, огромные залы, много кофе и зудящее чувство знаний. Чтобы собрать рекордно-длинную программу и количество слушателей мы работали рекордные 5 месяцев. До старта — 9 дней.


      Читать дальше →
    • Недостаточно знать, что такое Mutex, Semaphore и async/await. Надо знать всё, начиная с квантов

        Совсем скоро, 29-30 ноября в Санкт-Петербурге и 06-07 декабря — в Москве мы запустим шестой семинар по .NET. На этот раз — по теме многопоточки и конкурентности. Мы уже писали об этом пару раз на Хабре, но сегодня есть отдельный повод для этого: на семинаре настоящий эксклюзив. Будет описана работа гибридного примитива синхронизации: Monitor. Да, всем привычная вещица достойна отдельного доклада. Ведь он в своей работе учитывает и частоту процессора и количество ядер, учитывает lock convoy/starvation и вообще, очень сложен.


        А в конце статьи развлечения ради предложу пройти парочку QUIZов по многопоточке.


        Читать дальше →
        • +24
        • 6.8k
        • 9
      • CLRium #6: Concurrency & Parallelism. Два дня: от процессора до async/await


          Совсем скоро, 29-30 ноября в Санкт-Петербурге и 06-07 декабря — в Москве мы запустим шестой семинар по .NET. В рамках семинара мы полным ходом изучаем вопросы многопоточности, которые на самом деле очень и очень сложны. Программа немного меняется, но получается очень хардкорной для вас и волнительной — для нас. Я расширил описание уровня ОС до трёх слотов: теперь там можно будет почерпнуть:


          • Кванты времени, их длину, выбор их длины, изменение настроек системы так, чтобы выбрать длину квантов времени
          • Динамическое повышение приоритетов потоков и длин квантов в зависимости от разных условий: от признака нахождения окна на переднем плане до освобождения блокировок
          • Разработка собственного планировщика UMS потоков

          и многое другое. Кофе будет много.

          Читать дальше →
        • C 23 по 25 сентября пройдёт .NET Conf 2019

            C 23 по 25 сентября пройдет онлайн-конференция Microsoft .NET Conf. Что ожидается на конференции? Все темы можно посмотреть на сайте конференции, а ниже я представил наиболее значимые доклады:


            • Что нового в C# 8? (два доклада)
            • Переводим настольные .NET приложения на .NET Core
            • Разрабатываем Full-stack C# Вэб-приложения с Blazor и .NET Core 3. (по Blazor 3 доклада)
            • Разработка Cloud Native Apps с .NET Core 3.0 и Kubernetes
            • Entity Framework Core 3.0
            • Перерождение Visual Studio for Mac
            • Durable Functions 2.0 — Serverless Actors, Orchestrations, and Stateful Functions
            • Awesome games with .NET, Visual Studio 2019 and Unity 2019
            • и многое-многое другое

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


            Читать дальше →
          • Нам не нужны правки перевода: нашему переводчику виднее, как это должно переводиться

              Этот пост — попытка достучаться до издательств. Чтобы те услышали и отнеслись к своим переводам более ответственно.


              За свой путь разработчика я купил много различных книг. Книг самых разных издательств. И малых и больших. Прежде всего — больших издательств, у которых есть возможности вложиться в перевод технической литературы. Это были самые разные книги: все мы прошли или проходим через путь поиска себя. И все эти книги объединяло одно: они были переведены так, что их невозможно было читать. Со временем, конечно, привыкаешь и к переводу терминов (про себя переводя на те, которые используются повседневно) и к ломаному стилю изложения, по которому видно что этот текст взят с английского. Однако нет привычки к цене, которую просят издательства за популярные издания.



              В комментарии приглашаются издательства

              Читать дальше →
            • Garbage Collector. Полный курс + перевод из BOTR

              • Tutorial

              В данной статье вы встретите сразу два источника информации:


              1. Полный курс по работе Garbage Collector на русском языке: CLRium #6 (текущий семинар здесь)
              2. Перевод статьи из BOTR "Устройство сборщика мусора" от Маони Стевенс.

              Читать дальше →
              • +22
              • 7.2k
              • 2
            • С Днём Программиста

                День Программиста традиционно отмечается в 256-й день года. Число 256 выбрано потому, что это количество чисел, которые можно выразить с помощью одного байта (от 0 до 255).


                Все мы выбрали эту профессию по-разному. Кто-то вышел на нее случайно, кто-то выбрал специально, но теперь все мы трудимся вместе над одним общим делом: мы создаем будущее. Создаем прекрасные алгоритмы, заставляем эти коробочки работать, работать и еще раз работать, даря людям новые профессии и возможности для самовыражения… Даря людям возможность общаться друг с другом, зарабатывать на жизнь… Мы создаем для людей некоторую — ныне ставшую совершенно незаметной — часть реальности, которая стала настолько привычной и неотъемлемой частью нашей жизни, словно она стала законом природы. Подумайте сами: можно ли представить сегодня мир без интернета, смартфонов, компьютеров? Будь то вирусописатель или программист детских игрушек… Каждый из нас изменил чью-то жизнь…


                Если задуматься, то мы создаем из ничего, а наш материал — мысль. Наше полотно — код программы на любимом нами языке. И язык этот — способ проекции мысли. Способ говорить. Именно поэтому у нас так много языков: ведь все мы — разные и мыслим мы по-разному. Но мы прежде всего — творцы. Как писатели, которые, создавая в своих произведениях миры со своими законами, свойствами и делами оживляют фантазию читателя, наши миры возникают в некой связке машины и человека, становясь для каждого из нас чем-то большим, чем текстом программы.


                Почему?
              • CLRium #6: Парный доклад про Lock-Free, много теории и практически-полезных знаний

                  Совсем скоро, 29-30 ноября в Санкт-Петербурге и 06-07 декабря — в Москве мы запустим шестой семинар по .NET. На этот раз — по теме многопоточки и конкурентности. Мы уже писали об этом пару раз на Хабре, но сегодня — День Программиста и есть отличный повод дать вам всем комплимент: скидку на его посещение.


                  У меня для вас есть новость: мы с Андреем Гончаровым, моим хорошим другом и соратником решили сделать для вас доклады по lock-free, выступая вместе. Мне показалось, это должно сильно оживить атмосферу выступления. Андрей сейчас закапывается в эту тему так, что иногда его приходится даже останавливать: доклады будут очень интересными и полезными.


                  Юрий Власов, мой второй коллега нашёл библиотеку Microsoft.VisualStudio.Threading, которую с удовольствием использует в проектах. Он решил поведать вам о её богатых возможностях и применимости в различных задачах. Этот доклад отлично завершит тему lock-free, закрыв вопросы теории, оценки сложностей, анализа существующих алгоритмов и построения собственных вопросом хорошей реализации в виде промышленной библиотеки.


                  В честь Дня Программиста мы ввели промокод: CLRiumDevDay. Он действует всего-лишь два дня, когда можно забронировать билеты. Далее — вы имеете 5 дней на оплату билетов.
                  Первый день — скидка = 25%, второй = 15%

                  Читать дальше →
                  • +17
                  • 2.4k
                  • 3
                • История создания Norton Commander. Часть 1 / 3

                  • Translation
                  Пьяный программист сидит с открытым Norton Commander на экране. На обоих панелях открыт диск С. «Ну и зачем мне два диска С с одними и теми же файлами?» — подумал он и стер все его содержимое, нажав F8 и Enter.
                  — анекдот конца 80-х годов

                  Нортон (Norton Commander) for DOS – это файловый менеджер для DOS, который существовал в 5 основных версиях – 1.0, 2.0, 3.0, 4.0, 5.0, причем только последняя версия имеет подверсию 5.5. Многие версии до сих пор используются различными энтузиастами и лежат на различных сайтах по сети Интернет.

                  Это был, возможно, один из самых популярных файловых менеджеров в эпоху операционной системы DOS, который наряду с XTree порвал со своими корнями DOS и в виде других программ, унаследовавших его функциональность, которые существуют на других операционных системах.


                  Читать дальше →
                • История и альтернативы платформы .NET

                    Недавно мне повезло пообщаться с Крисом Бэйконом, который написал DotNetAnywhere (альтернативный вариант .NET Runtime), и я остроумно заметил:


                    … ты, наверное, один из тех немногих, кто создал собственную среду выполнения .NET, и это круто!

                    если исключить тех, кто на зарплате, т.е. инженеров Microsoft/Mono/Xamarin, их очень немного.



                    Это — перевод статьи Matt Warren (A History of .NET Runtimes). Дабы не делать повторную публикацию, оставлю as is

                    Читать дальше →
                    • +63
                    • 17.3k
                    • 9
                  • Мониторинг .NET приложений

                    • Translation

                    .NET – управляемая среда выполнения. Это означает, что в ней представлены высокоуровневые функции, которые управляют вашей программой за вас (из Introduction to the Common Language Runtime (CLR), 2007 г.):


                    Среда выполнения предусматривает множество функций, поэтому их удобно разделить по следующим категориям:

                    1. Основные функции, которые влияют на устройство других. К ним относятся:
                      1. сборка мусора;
                      2. обеспечение безопасности доступа к памяти и безопасности системы типов;
                      3. высокоуровневая поддержка языков программирования.
                    2. Дополнительные функции– работают на базе основных. Многие полезные программы обходятся без них. К таким функциям относятся:
                      1. изолирование приложений с помощью AppDomains;
                      2. защита приложений и изолирование в песочнице.
                    3. Другие функции – нужны всем средам выполнения, но при этом они не используют основные функции CLR. Такие функции отражают стремление создать полноценную среду программирования. К ним относятся:
                      1. управление версиями;
                      2. отладка/профилирование;
                      3. обеспечение взаимодействия.

                    Видно, что хотя отладка и профилирование не являются основными или дополнительными функциями, они находятся в списке из-за ‘стремления создать полноценную среду программирования’.


                    Читать дальше →
                    • +19
                    • 8.2k
                    • 2
                  • CLRium #6: Concurrency & Parallelism. Обучение магии распараллеливания задач

                      Наша команда по-настоящему взбудоражена: ведь мы находимся в стадии производства сложнейшего для нас семинара среди всех нами созданных: семинара по многопоточке, конкурентности и прочим смежным вопросам. Мы немного боимся: мы создали целый огромный процесс внутренних согласований докладов, источников информации, вычитываем, сверяем… исправляем… и всё это для того чтобы создать его полезным для каждого уровня подготовки.


                      Наша задача звучит очень просто: за два полных дня научить вас всем слоям многопоточки.


                      Открыть программу
                      • +22
                      • 5.4k
                      • 2
                    • На спор: прочитав до конца, вы поймёте, как и почему именно так работает GC

                        Скажу сразу: я никогда не жду развёрнутого ответа на этот вопрос на собесах. Это глупо и в моем случае — эгоистично. Однако, на мой взгляд, помимо общего интереса к платформе, знать, как он работает очень полезно, т.к. это снимает целый ряд вопросов. Например, исключает вариант, когда разработчик считает, что Dispose вызывается автоматически и вызывать его самому не надо. Или же если разработчик более опытен, помогает ему автоматически, на уровне мышечной памяти писать код, приводящий к наименьшему количеству проблем.


                        Другой вопрос, что мне субъективно не очень нравится, как объясняется его работа. Потому, предлагаю альтернативный подход, описанный в моей книге, .NET Platform Architecture.


                        Если мы с вами будем досконально разбираться, почему были выбраны именно эти два алгоритма управления памятью: Sweep и Compact, нам для этого придётся рассматривать десятки алгоритмов управления памятью, которые существуют в мире: начиная обычными словарями, заканчивая очень сложными lock-free структурами. Вместо этого, оставив голову мыслям о полезном, мы просто обоснуем выбор и тем самым поймём, почему выбор был сделан именно таким. Мы более не смотрим в рекламный буклет ракеты-носителя: у нас на руках полный набор документации.


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


                        Читать дальше →
                      • Инструментарий для анализа и отладки .NET приложений

                        • Translation

                        Заглянуть «под капот» кода или посмотреть на внутреннее устройство CLR можно с помощью множества инструментов. Этот пост родился из твита, и я должен поблагодарить всех, кто помог составить список подходящих инструментов. Если я пропустил какие-то из них, напишите в комментариях.


                        Во-первых, я должен упомянуть, что хороший отладчик уже присутствует в Visual Studio и VSCode. Также существует множество хороших (коммерческих) профилировщиков .NET и инструментов мониторинга приложений, на которые стоит взглянуть. Например, недавно я попробовал поработать с Codetrack и был впечатлён его возможностями.


                        Однако оставшийся пост посвящён инструментам для выполнения отдельных задач, которые позволят лучше понять, что происходит. Все инструменты имеют открытый исходный код.


                        Читать дальше →
                        • +50
                        • 14.7k
                        • 9
                      • Асинхронные Stream в C# 8

                        • Translation
                        • Tutorial

                        Функционал Async/Await появился в C# 5, чтобы улучшить скорость отклика пользовательского интерфейса и веб-доступ к ресурсам. Другими словами, асинхронные методы помогают разработчикам выполнять асинхронные операции, которые не блокируют потоки и возвращают один скалярный результат. После многочисленных попыток Microsoft упростить асинхронные операции, шаблон async/await завоевал хорошую репутацию среди разработчиков благодаря простому подходу.


                        Существующие асинхронные методы значительно ограничены тем, что должны возвращать только одно значение. Давайте рассмотрим некий обычный для такого синтаксиса метод async Task<int> DoAnythingAsync(). Результатом его работы является некоторое одно значение. Из-за такого ограничения нельзя использовать эту функцию с ключевым словом yield и асинхронным интерфейсом IEnumerable<int> (чтобы вернуть результат асинхронного перечисления).


                        Читать дальше →
                      • CLRium #6: Concurrency & Parallelism. Два дня: от процессора до async/await




                          Как вы уже заметили, формат семинара эволюционировал и принял новую форму: каждый последующий семинар теперь посвящается целиком и полностью какой-либо теме. Пятый был посвящен теме Garbage Collector и за 10 часов раскрыл всё, что только возможно, оставив за скобками совсем уж частные вопросы. А его кульминацией был доклад про практическое применение (вопрос, который интересует каждого — "зачем всё это знать??")


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


                          Читать дальше →
                        • The architecture of an exceptional situation: pt.2 of 4

                            I guess one of the most important issues in this topic is building an exception handling architecture in your application. This is interesting for many reasons. And the main reason, I think, is an apparent simplicity, which you don’t always know what to do with. All the basic constructs such as IEnumerable, IDisposable, IObservable, etc. have this property and use it everywhere. On the one hand, their simplicity tempts to use these constructs in different situations. On the other hand, they are full of traps which you might not get out. It is possible that looking at the amount of information we will cover you’ve got a question: what is so special about exceptional situations?


                            However, to make conclusions about building the architecture of exception classes we should learn some details about their classification. Because before building a system of types that would be clear for the user of code, a programmer should determine when to choose the type of error and when to catch or skip exceptions. So, let’s classify the exceptional situations (not the types of exceptions) based on various features.

                            Read more →
                          • Exceptional situations: part 1 of 4


                              Introduction


                              It’s time to talk about exceptions or, rather, exceptional situations. Before we start, let’s look at the definition. What is an exceptional situation?


                              This is a situation that makes the execution of current or subsequent code incorrect. I mean different from how it was designed or intended. Such a situation compromises the integrity of an application or its part, e.g. an object. It brings the application into an extraordinary or exceptional state.


                              But why do we need to define this terminology? Because it will keep us in some boundaries. If we don’t follow the terminology, we can get too far from a designed concept which may result in many ambiguous situations. Let’s see some practical examples:


                               struct Number
                               {
                                   public static Number Parse(string source)
                                   {
                                       // ...
                                       if(!parsed)
                                       {
                                           throw new ParsingException();
                                       }
                                       // ...
                                   }
                              
                                   public static bool TryParse(string source, out Number result)
                                   {
                                      // ..
                                      return parsed;
                                   }
                               }

                              This example seems a little strange, and it is for a reason. I made this code slightly artificial to show the importance of problems appearing in it. First, let’s look at the Parse method. Why should it throw an exception?

                              Read more →
                            • Оптимизация программ под Garbage Collector

                                Не так давно на Хабре появилась прекрасная статья Оптимизация сборки мусора в высоконагруженном .NET сервисе. Эта статья очень интересна тем, что авторы, вооружившись теорией сделали ранее невозможное: оптимизировали свое приложение, используя знания о работе GC. И если ранее мы не имели ни малейшего понятия, как этот самый GC работает, то теперь он нам представлен на блюдечке стараниями Конрада Кокоса в его книге Pro .NET Memory Management. Какие выводы почерпнул для себя я? Давайте составим список проблемных областей и подумаем, как их можно решить.


                                На недавно прошедшем семинаре CLRium #5: Garbage Collector мы проговорили про GC весь день. Однако, один доклад я решил опубликовать с текстовой расшифровкой. Это доклад про выводы относительно оптимизации приложений.


                                Читать дальше →
                                • +40
                                • 8.3k
                                • 4
                              • Disposable pattern (Disposable Design Principle) pt.3


                                  Multithreading


                                  Now let’s talk about thin ice. In the previous sections about IDisposable we touched one very important concept that underlies not only the design principles of Disposable types but any type in general. This is the object’s integrity concept. It means that at any given moment of time an object is in a strictly determined state and any action with this object turns its state into one of the variants that were pre-determined while designing a type of this object. In other words, no action with the object should turn it into an undefined state. This results in a problem with the types designed in the above examples. They are not thread-safe. There is a chance the public methods of these types will be called when the destruction of an object is in progress. Let’s solve this problem and decide whether we should solve it at all.


                                  This chapter was translated from Russian jointly by author and by professional translators. You can help us with translation from Russian or English into any other language, primarily into Chinese or German.

                                  Also, if you want thank us, the best way you can do that is to give us a star on github or to fork repository github/sidristij/dotnetbook.
                                  Read more →