Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: Обучение c
Акція «Космічні знижки на ITVDN» 2019

Автор: Редакція ITVDN

С 13 по 20 июня на ITVDN космические скидки! В акционном пакете подписки доступны все курсы, представленные в Каталоге, а также: все учебные материалы с примерами кода и опорным конспектом проверка домашних заданий и консультации с тренером интерактивный тренажер навыков программирования онлайн тестирование и сертификация по пройденным курсам Вы можете учиться без ограничений по любой специальности или по своему собственному плану, выбирая те курсы, которые Вам интересны и соответствуют Вашему уровню подготовки. Космические скидки Всем известно, что программистом нельзя стать за месяц, и за два, и за три... Как показывает опыт, самые талантливые и мотивированные студенты добиваются первых успехов в разработке через полгода самообучения.  С хорошим наставником этот срок может быть короче. Но найти наставника довольно сложно. Для всех, кто решительно настроен учиться, чтобы стать программистом, мы дарим космические скидки на долгосрочные подписки. Первая волна скидок – 13, 14, 15 июня скидка на Пакеты "Базовый"  и "Премиум" – 40%. Вторая волна – 16, 17, 18 июня – 35%. Третья волна  - 19 и 20 июня – 30%. Акционная стоимость Пакета "Премиум" (12 мес.): 13, 14, 15 июня  -  $102 (это $8.5 в месяц) 16, 17, 18 июня  -  $110.5 (это $9.2  в месяц) 19 и 20 июня - $119 (это $9.9  в месяц) Акционная стоимость Пакета "Базовый" (6 мес.): 13, 14, 15 июня  - $54 (это $9 в месяц) 16, 17, 18 июня - $58.5 (это $9.75  в месяц) 19 и 20 июня - $63 (это $10.5  в месяц) Долгосрочные подписки – это самый лучший выбор для тех, кто хочет пройти полное обучение по специальности и в итоге подтвердить свой уровень Дипломом специалиста. В пакете подписки для Вас будут доступны более 170 курсов по программированию, которые есть на данный момент, а также все новые, которые появятся на ITVDN в то время, когда Ваша подписка будет активна. Ежемесячно мы записываем 3-5 новых видео курсов по самым актуальным технологиям, учитывая пожелания наших пользователей. Вы сможете неоднократно возвращаться к пройденным курсам и сложным темам, консультироваться с тренером и формировать практические навыки программирования, используя интерактивный тренажер. Коллектив ITVDN желает Вам успешного достижения целей в учебе и карьере и будет рад помочь Вам в этом.  Оставайтесь с нами! КУПИТЬ ПОДПИСКУ
Акція «Виграй книгу з Java»

Автор: Редакція ITVDN

Здравствуйте, дорогие друзья! У нас отличная новость – ITVDN вместе с книжным интернет магазином Balka Book проводит розыгрыш бестселлера для Java разработчиков - "Изучаем Java" Кэти Сьерры, Берта Бейтса. Будет разыграно 5 книг! Язык программирования Java стабильно занимает лидирующие позиции в разных международных рейтингах. "Изучаем Java" - это отличная книга. Она не только научит вас теории языка Java и объектно-ориентированного программирования, она реально поможет вам стать программистом. В ее основу положен уникальный метод обучения на практике. Вы освоите синтаксис и концепции языка, работу с потоками, работу в сети, распределенное программирование. Вся теория закрепляется интереснейшими примерами и тестами. Каждый Java-разработчик будет рад такому подарку! Представляем спонсора нашей акции – книжный интернет магазин Balka Book. balka-book.com создан еще в 2004 году, и является одним из первых книжных интернет-магазинов в Украине. Balka Book – это: лучший выбор компьютерной литературы в Украине; книги для дизайна; техническая литература; бизнес, экономика; художественная литература; учебная литература; детская литература; книги под заказ на языке оригинала. Balka Book – читайте, чтобы жить. Условия акции В период с 4 по 10 октября 2018 года на ITVDN будет проходить акция - вы можете выиграть книгу "Изучаем Java". Чтобы принять участие в акции, нужно: Быть подписчиком канала ITVDN на YouTube Поделиться любым видео ITVDN в одной из социальных сетей* Заполнить анкету участника акции * На момент проведения розыгрыша Ваша стена в социальной сети должна быть открыта, чтобы мы смогли проверить выполнение условий акции. Для определения победителей будет использоваться сервис random.org. Розыгрыш состоится в прямом эфире на YouTube канале ITVDN 11 октября 2018 года в 14:00. Победителей будет пятеро! UPD: Розыгрыш по акции переносится по техническим причинам на 12 октября 2018 года в 15:00. Просим прощения за неудобства! Участвуйте в акции и пусть удача улыбнется Вам!
Карта спеціальності Python розробник.

Автор: Сергій Яценко

<p>Python &mdash; это один из самых простых и лаконичных языков программирования в мире. Он отличается своей легкостью и доступностью для новичков, а также чрезвычайно широкой областью применения: от встраиваемых систем и веб-приложений до компьютерных игр, Data Science и тестирования ПО. Знание данного языка позволит реализовать себя практически в любом IT-направлении. Причём стать пайтон разработчиком может каждый, вне зависимости от текущей сферы занятости.</p> <p>Если вы готовы сделать шаг навстречу востребованной IT-специальности, которая предлагает спектр интересных задач и большое количество инструментов для их решения, наш вебинар будет как нельзя кстати!</p> <p>Цель встречи &mdash; помочь вам найти ответы на все вопросы, касающиеся выбора этой специальности, обучения и карьеры, правильно расставить приоритеты в выборе технологий и учебных материалов.</p> <p><strong>Программа встречи: </strong></p> <ol> <li>Кто такой Python разработчик?</li> <li>Актуальность специальности и востребованность на IT-рынке.</li> <li>Как стать Python разработчиком: <ol style="list-style-type:lower-alpha;"> <li>предварительные требования;</li> <li>карта специальности;</li> <li>обзор обязательных и факультативных технологий.&nbsp;</li> </ol> </li> <li value="4">Где и как изучить язык программирования Python.</li> <li>Как получить первый практический опыт.</li> <li>Стажировка и первая работа - возможности и перспективы.</li> <li>Вопросы и ответы.</li> </ol> <p><strong>Целевая аудитория</strong>: начинающие разработчики, студенты ВУЗов, а также все, кто интересуется Python направлением и хочет профессионально развиваться в нём.</p> <p><strong>Условия участия:</strong> бесплатно. Для получения приглашения на онлайн-трансляцию заполните регистрационную форму.</p>
Карта спеціальності Java розробник.

Автор: Бондаренко Андрій

<p>Java &mdash; это популярный объектно-ориентированный язык программирования, на котором написаны программы для более 3-х миллиардов устройств по всей планете. Сфера его применения практически безгранична, а те, кто хорошо владеют Java, имеют большие возможности и всегда будут обеспечены интересными задачами и высокооплачиваемой работой.</p> <p>На вебинаре вы получите ответы на все вопросы, связанные с обучением, получением опыта, расстановкой приоритетов в выборе технологий и учебных материалов, а также карьерой программиста Java направления.</p> <p><strong>Программа встречи: </strong></p> <ol> <li>Кто такой Java разработчик?</li> <li>Актуальность специальности и востребованность на IT-рынке.</li> <li>Как стать Java разработчиком: <ol style="list-style-type:lower-alpha;"> <li>предварительные требования;</li> <li>карта специальности;</li> <li>обзор обязательных и факультативных технологий.&nbsp;</li> </ol> </li> <li value="4">Где и как изучить язык программирования Java.</li> <li>Как получить первый практический опыт.</li> <li>Стажировка и первая работа - возможности и перспективы.</li> <li>Вопросы и ответы.</li> </ol> <p><strong>Целевая аудитория</strong>: начинающие разработчики, студенты ВУЗов, а также все, кто интересуется Java направлением и хочет профессионально развиваться в нём.</p> <p><strong>Условия участия:</strong> бесплатно. Для получения приглашения на онлайн-трансляцию заполните регистрационную форму.</p> <hr /> <p><strong>Информационные партнеры:</strong></p> <p><strong><a href="https://ru.jobsora.com/" name="Работа. Вакансии. Трудоустройство" target="_blank"><img alt="Работа в России" src="https://itvdn.blob.core.windows.net/mail-delivery/mail-delivery-573a679a-1426-488a-99f9-3c79d5d073ad.png" style="width: 171px; height: 60px; float: left;" /></a></strong><br /> <span style="font-size: 13px;">&nbsp;Работа. Вакансии. Трудоустройство</span></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p>
Хто такий Data Scientist?

Автор: Ілля Іорін

<p>Вебинар про задачи, которые решает Data Scientist. Как декомпозируются бизнес задачи в data science и про то, какие навыки необходимы для решения всех этапов задач.</p> <p><strong>План вебинара:</strong></p> <ol> <li>Supervised learning&nbsp;</li> <li>Deep learning</li> <li>С какими данными машинное обучение работает и какие задачи решает: <ol style="list-style-type:lower-alpha;"> <li>Табличные данные</li> <li>Изображения</li> <li>Временные ряды</li> <li>Текст</li> <li>Звук</li> </ol> </li> <li>Как декомпозировать data science задачи.</li> <li>Что нужно знать, чтобы решать data science задачи.</li> </ol> <p><strong>Целевая аудитория:</strong></p> <p>Данный вебинар будет интересен людям без опыта работы в IT, кто хочет выбрать, чем он будет заниматься и рассматривает Data Science, а также IT специалистам, которые хотят перепрофилироваться в Data Science.</p> <hr /> <p><strong>Информационные партнеры:</strong></p> <p><strong><a href="https://t.me/ITMeeting" rel="nofollow" target="_blank"><img alt="" src="https://itvdn.blob.core.windows.net/mail-delivery/mail-delivery-bc938e8d-044c-4c58-a441-7ee9274a15d2.jpg" style="width: 100px; height: 100px; float: left;" /></a></strong></p> <p>&nbsp;</p> <p style="margin-left: 80px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="https://t.me/ITMeeting" rel="nofollow" target="_blank">ITMeeting</a> - телеграм-канал с анонсами бесплатных мероприятий по разработке</p> <p style="margin-left: 80px;">&nbsp;</p> <p style="margin-left: 80px;">&nbsp;</p>
Як правильно створити CV Junior розробнику

Автор: Ірина Титенко

<p>Каждый разработчик после обучения сталкивается с потребностью создания CV для поиска первой работы. И для многих написать тонну кода гораздо легче, чем составить хороший экземпляр резюме, который поможет соискателю выделиться среди сотни других.<br /> <br /> Чтобы помочь в столь тонком процессе создания своей идеальной &ldquo;визитной карточки&rdquo;, мы подготовили для вас познавательный вебинар! Наш HR-менеджер Ирина Тытенко расскажет, на что обычно обращают внимание рекрутеры при просмотре CV, какие важные блоки должны обязательно присутствовать, а также, как должно выглядеть качественное CV, в разы повышающее шансы на успех.</p> <p><strong>Важная информация! </strong>Если вы хотите, чтобы мы в прямом эфире разобрали ваше резюме, пришлите его на почту до 2 февраля. Имя и Фамилию писать не нужно.</p> <p><strong>Программа встречи: </strong></p> <ol> <li>Что такое CV и зачем оно нужно?</li> <li>На что обращают внимание рекрутеры?</li> <li>Какие блоки должны быть в CV и что в них писать?</li> <li>Как писать об опыте работы и что делать, если его нет?</li> <li>Почему pet-проекты должны быть в CV джуниора?</li> <li>Как оценить свое CV с точки зрения рекрутера?</li> </ol> <p><strong>Целевая аудитория:</strong> студенты CyberBionic Systematics, а также начинающие разработчики, которые планируют начать свою карьеру в 2021 году и хотят сделать своё CV козырной картой, переиграв конкурентов в гонке за вакантное место.</p> <p><strong>Условия участия</strong>: бесплатно. Для получения приглашения на онлайн-трансляцию заполните регистрационную форму.</p>
Створення простої казуальної гри на Python.

Автор: Людмила Міщенко

<p>На вебинаре будет рассмотрена реализация простой игры на Python. Суть игры заключается в обучении людей, особенно детей, вести эко-дружественный способ жизни - правильно сортировать мусор. То есть, польза будет не только для вас в получении новых знаний в программировании, но и в попытке проявить больше заботы о нашей планете.</p> <p><strong>План вебинара:</strong></p> <p>1. Постановка задачи</p> <p>а) Цель вебинара - Создать свою игру на Python, которая учит сортировать мусор;<br /> б) правила игры - выбирать правильную корзину для разного типа мусора; окончание игры по таймеру; в конце игры пользователь получает сумму заработанных баллов за правильно выбранные корзины.</p> <p>2. Реализация программы:</p> <p>а) установка модулей;<br /> б) загрузки необходимых изображений;<br /> в) написание логики попадания мусора в корзину (поведение корзины);<br /> г) объявление и описание элементов мусора (органика, пластик, бумага) - класс поведение мусора;<br /> д) вызов написанных классов и запуск игры.</p> <p>3. Получение результатов:</p> <p>а) запуск и тестирование кода;<br /> б) прохождения игры;<br /> в) анализ проделанной работы - добавление и изменение условий игры, оптимизация кода, будущие доработки.</p> <p><strong>Целевая аудитория:</strong></p> <p>Данный вебинар будет интересен для студентов, взрослых, а также детей, которые хотят интересно и увлекательно сделать свои первые шаги программирования на Python.</p>
Як стати FrontEnd-розробником

Автор: Тисячний Влад

<p dir="ltr">FrontEnd Developer - это разработчик, который создает клиентскую сторону веб-сайтов. Ваши любимые сервисы - социальные сети, видеохостинги, интернет-магазины - любой интернет-продукт необходимо преподнести пользователю в привлекательном и удобном для него виде. В такой задаче никак не обойтись без фронтенд специалиста.</p> <p dir="ltr">Какие требования выдвигают работодатели к FrontEnd-разработчику? Что нужно знать и уметь, с чего начать и как лучше спланировать обучение. На вебинаре, вы получите ответы на все интересующие вас вопросы и составите целостное представление о профессии фронтендщика.&nbsp;</p> <p dir="ltr"><strong>План вебинара:</strong></p> <ol dir="ltr"> <li role="presentation">Пару слов об авторе. Как я начинал свой путь во FrontEnd.</li> <li role="presentation">Какие бывают типы FrontEnd-разработчиков?</li> <li role="presentation">Какие технологии должен знать каждый фронтенд специалист?&nbsp;</li> <li role="presentation">Версии JavaScript (5/6/7): разница, зачем их выпускают и почему их надо учить?</li> <li role="presentation">Что такое сборщики пакетов (Webpack, Gulp) и зачем они нужны?</li> <li role="presentation">Назначение менеджера пакетов NPM</li> <li role="presentation">Что такое фреймворк?</li> <li role="presentation">Фреймворки Angular/React/Vue/React Native: ключевые концепции, примеры кода, что и когда лучше использовать?</li> <li role="presentation">Рекомендуемая литература, полезные ссылки</li> <li role="presentation">Ответы на вопросы</li> </ol> <p dir="ltr"><strong>Целевая аудитория:</strong></p> <p dir="ltr">Все, кого интересует веб разработка, а также те, кто уже понял, что хочет стать FrontEnd-разработчиком.</p>
ASP.NET Core vs Node.JS

Автор: Guillaume Jacquart

Я работал с .NET-платформой на протяжении 5 лет – как в плане профессиональной необходимости в качестве бек-енд разработчика и архитектора, так и в плане определенных личных задач - таких как открытые и закрытые сторонние проекты. После нескольких лет работы с экосистемой PHP и имея солидный стаж в плане Java, я пришел к выводу, что язык C# для меня представляет, пожалуй, наибольший интерес – благодаря своему удобству и эффективности. Этот язык комплексный, тщательно продуманный и лично для меня в работе с C# лучшую среду программирования, нежели Visual Studio, человечество еще не изобрело. Более того, ASP.NET уже содержит в себе все, что необходимо веб-разработчику, не требуя установки дополнительных фрейморков и библиотек. Единственное, что меня не очень устраивало в плане .NET-системы, это ее «закрытость» и использование преимущественно Microsoft-платформы (хотя и существуют специальные Mono, которые позволяют в качестве альтернативы запускать шарп-проекты и под Linux, но достигается это ценой утраты целого ряда полезных фичей). По этой причине я обратил свое внимание на Node.JS, хотя мои коллеги называли JavaScript бесполезным языком, а Node.JS – хламом. Я был очарован однопоточной каллбэк-системой, я наслаждался, создавая REST API, используя ExpressJS. Но затем Microsoft выпустила кроссплатформенную технологию ASP.NET Core, и я призадумался, что же и когда стоит использовать. После чего я решил собрать как можно больше информации касательно возможностей и реализации тех или иных фичей двух технологий, после чего выбрал для себя, по моему мнению, наиболее удобную технологию, в рамках которой и развернул свой новый проект. Надеюсь, эта публикация вам тоже поможет прийти к определенному решению. Модель обработки запроса Node.JS Node.JS успел зарекомендовать себя как однопоточный обработчик запросов. Что это значит? Это значит, что вместо обработки каждого поступившего http-запроса внутри отдельного потока или процесса (наподобие Apache), обработка производится внутри одного потока. Подобный подход делает обработку запросов однопоточной, тогда как в Apachi\PHP обработка является многопоточной. Однако, что касательно Node.JS, здесь преимущество заключается в асинхронной работе системного ввода-вывода, которое, соответственно, не блокирует требуемый поток. Операция ввода\вывода производится в рамках отдельного потока, в то время как основной продолжает свою работу. Как только вторичный поток завершает свою работу, вызывается callback, который, соответственно, передает в контекст основного потока результат. С одной стороны, использование подобного подхода прекрасно подходит для приложений, интенсивно работающих с вводом\выводом. С другой стороны, появляется вероятность так называемого «ада обратных вызовов», который провялятся в цикличной сложности кода. Будем надеяться, что новая версия введёт в обиход полноценные async\await. Однопоточная модель обработки запросов Node.JS может быть сгруппирована при помощи использования нативной кластеризации, Nginx или PM2. ASP.NET (синхронный) Исторически так сложилось, что обработка запросов ASP.NET MVC (или Web Api) производится подобно Apache / PHP: каждый запрос обрабатывается внутри своего собственного потока пула потоков. И каждая команда ввода-вывода производится синхронно внутри каждого из потоков. В контексте жесткой работы с вводом-выводом подобный подход, конечно, менее удобный, если сравнивать со схемой Node.JS. Хвала Небесам, .NET Framework 4.5 вводит в C# async\await, что также исправляет сложившуюся ситуацию. ASP.NET Core (асинхронный) Паттерн async\await позволяет в полной мере ощутить все прелести асинхронного программирования. Действительно, теперь появилась возможность указать каждый обработчик запросов как асинхронный, благодаря чему работа с системой ввода-вывода будет производиться в контексте своего потока. Это позволит не блокировать основной поток. Подобная модель на базе Task`ов позволяет использовать обратные вызовы, ощутить все прелести асинхронности и прочее. .NET Core часто применяет паттерн async\await при интенсивной работе с системой ввода-вывода.   Async\await Node.JS VS Async\await ASP.NET Core Пример кода Node.JS для асинхронного запроса в базу данных: Пример того же кода на ASP.NET Core (фрагмент класса Startup):   Разница между двумя моделями в том, что ASP.NET Core способен обрабатывать большее количество запросов благодаря своей дефолтной параллельности. В то же время переключение между асинхронными потоками может занимать время в случае использования большого количества общих для многих потоков переменных. В такой ситуации все же Node.JS будет быстрее.   Много современных языков программирования, вроде того же C#, реализуют асинхронный ввод-вывод, который часто недооценен сообществом Node.JS-разработчиков, но который может приводить к приятным неожиданностям. В этом случае Node.JS в значительно меньшей мере технологичный, если сравнивать его с ASP.NET Core. Язык программирования Особенности и безопасность Вращаться в среде C#-разработчиков – значит выслушать множество критики в адрес динамической типизации и удивительных булевых преобразований JavaScript. Впрочем, эта критика является обоснованной, если учитывать, что JavaScript был разработан всего за 10 дней для динамического контента HTML.   С другой стороны, с того времени язык очень даже «вырос», и новая спецификация привносит такие фичи, как: Классы Новые идентификаторы (const, let), повышающие надежность кода Указательные функции Интерполяцию строк Генераторы Элементы рефлексии Впрочем, C# все равно остается намного более мощным языком программирования, ибо все вышеперечисленное – всего лишь небольшая часть того, чем может похвастаться строго-типизированный объектно-ориентированный язык программирования. Мне кажется, что для C# лучшей среды работы, нежели Visual Studio, просто не найти. Однако, если учитывать рост спроса на рынок микросервисов, большинство из особенностей подобных гигантов здесь не найдут свое применение. Изучение Если вы раньше работали с классической MVC-архитектурой, переход на Node.JS \ Express затребует некоторое время, чтобы привыкнуть. Некоторые же вещи могут вообще оказаться в новинку. Также нужно будет время для того, чтобы «переварить» событийно-ориентированную парадигму Node.JS. Что действительно может показаться запутанным впервые при работе со средними или большими приложениями, так это паттерны рефакторинга кода и, собственно говоря, архитектура кода. Так как функциональность Express.js очень гибкая, выбор «правильной» архитектуры и файловой структуры может быть затруднительным. С другой стороны, для создания качественного приложения без этого – никак. Что же касается ASP.NET (Core) MVC / WebApi, то тут уже предоставляется готовая файловая структура. Да, разработчик может применить немного «креативности» при создании бизнес-логики и слоя для работы с базой, но предопределенность архитектуры упрощает разработку. Однако, в случае с маленькими приложениями, JS-платформа более предпочтительна, так как позволяет написать сайт-визитку с использованием одного лишь js-файла и одного лишь package.json. Продуктивность Я обнаружил, что написание простого кода является более быстрым при использовании Node.JS. Причина в том, что простые приложения тут проявляют большую «гибкость». Также возникают вопросы касательно типизации языка, так как в некоторых случаях оказывается, что динамическая типизация является скорее плюсом, чем минусом. С другой стороны, я заметил, что при написании объемного кода, более читабельным он оказывается при работе с C#, чем с JavaScript. Думаю, причина этому – строгие ооп-парадигмы. Что касается отладки и юнит-тестирования, тут C# / Visual Studio также показывают лучшую продуктивность, хотя и сказать, что JavaScript совместно с Visual Studio Code пасет задних, нельзя. Время построения маленьких js-приложений также меньше. Екосистема В этом плане две технологии отличаются больше всего. Node.JS обязана своим развитием в основном сообществу, которое и разработало для неё большее количество существующих популярных библиотек. С одной стороны, вы чувствуете себя очень свободно в выборе модулей для разработки. С другой же, внезапное обновление одного из пакетов, отсутствие надлежащей проверки на ошибки и стабильность, в некоторых случаях могут легко привести к обвалу всего приложения. ASP.NET Core технология разработана проверенной командой профессионалов из Microsoft. И она предоставляет абсолютно все, что необходимо разработчику веб-приложений любых направлений. Кроме того, сторонние библиотеки также качественно выполнены и разработаны другими крупными проверенными компаниями. Один из многочисленных примеров – ORM-инструменты. Entity Framework, официальный инструментарий для работы с базой данных, предоставляет абсолютно все, что необходимо разработчику. Публикация и запуск А вот это та область, где Node.JS, без сомнения, лидирует. Технология является открытой, кросс-платформенной, поддерживает докеризацию. Это значит, что вы запросто сможете запустить свое приложение под такими платформами: На собственном Linux, Windows или Mac-сервере. Все, что для этого нужно – это движок Node.JS и реверсивный прокси-сервер (наиболее популярный – Nginx). Докер-контейнер. Большинство PaaS-провайдеров (AWS, Google App Engine, Azure, Heroku, …) Сервис Now, который позволяет провести запуск Node.JS-приложения в одну строчку без предварительной конфигурации. Также есть много подходящих CI & CD – платформ. Что же в случае ASP.NET-стека, тут все обстоит несколько печальнее. Хотя и ASP.NET Core также кросс-платформенная, количество сервисов для публикации несоизмеримо меньшее. Вот какие хостинги я знаю на данный момент: Собственный Windows-сервер с классическим IIS. Собственный Linux-сервер с реверсивным прокси. Докер-контейнер под Windows. Работает отлично, но занимает много места. Некоторые облачные сервисы PaaS. В основном, Azure, но есть также некоторые неофициальные билды Heroku. Заключение Node.JS обладает асинхронной событийно-ориентированной моделью обработки запросов, которая не очень то и уступает многопоточной async\await модели ASP.NET. Производительность Node.JS – приложений не всегда лучше, чем ASP.NET Core. Можно сказать, она даже хуже. Язык JavaScript не так уж и плох (и становится лучше!). А использование его вместе с Node.JS может дать приятный результат. ASP.NET (Core) лучше всего подходит для объемных приложений и предоставляет все необходимые разработчику инструменты высшего качества. Для микро- или среднеразмерных сервисов Node.JS предоставляет широкие возможности в плане публикации. И, как всегда, не существует одного лучшего инструмента «на все случаи жизни». Попробуйте доступные и подберите для себя тот, который лучше всего отвечает вашим требованиям. Автор перевода: Евгений Лукашук Источник
Реалізація успадкування перерахувань за допомогою розширення для Visual Studio, що базується на Roslyn

Автор: Редакція ITVDN

Введение В С# программировании необходима возможность расширять простое уравнение. Например, когда нужно использовать перечисления из библиотеки dll, которые невозможно изменить в коде, но и в то же время нужно использовать дополнительные значения, которых нет в библиотеке. Решить проблему можно при помощи системы Roslyn, основанной на расширении VS для создания отдельных файлов. Данный подход похож на моделирование множественного наследования в шаблоне "Implementing Adapter Pattern" и "Imitating Multiple Inheritance" в C# с использованием системы Roslyn, основанной на VS Extension Wrapper Generator. Формулировка проблематики Обратите внимание на схему EnumDerivationSample. Она содержит негенерированный код, большая часть которого будет сгенерирована позже. Схема содержит тип перечисления BaseEnum: public enum BaseEnum {        A,        B } Также в ней присутствует тип перечисления DerivedEnum  public enum DerivedEnum {        A,        B,        C,        D,        E } В перечислении DerivedEnum перечень значений А и В такие же, как в перечислении BaseEnum. Файл DerivedEnum.cs также содержит статический класс DeriveEnumExtensions для конвертации BaseEnum в DerivedEnum и наоборот: public static class DeriveEnumExtensions {        public static BaseEnum ToBaseEnum(this DerivedEnum derivedEnum)        {              int intDerivedVal = (int)derivedEnum;              string derivedEnumTypeName = typeof(DerivedEnum).Name;              string baseEnumTypeName = typeof(BaseEnum).Name;              if (intDerivedVal > 1)              {                     throw new Exception                            (                            "Cannot convert " + derivedEnumTypeName + "." +                            derivedEnum + " value to " + baseEnumTypeName +                            " type, since its integer value " +                            intDerivedVal + " is greater than the max value 1 of " +                            baseEnumTypeName + " enumeration."                            );              }              BaseEnum baseEnum = (BaseEnum)intDerivedVal;              return baseEnum;        }        public static DerivedEnum ToDerivedEnum(this BaseEnum baseEnum)        {              int intBaseVal = (int)baseEnum;              DerivedEnum derivedEnum = (DerivedEnum)intBaseVal;              return derivedEnum;        } } Преобразование значений BaseEnum в DerivedEnum всегда проходит успешно, в то время как преобразование в обратном направлении может быть проблематичным. Например, если значение DerivedEnum больше 1 (значение BaseEnum.B – наибольшее значение в типе перечисления BaseEnum). Функция Program .Main (...) используется для тестирования функциональных характеристик: static void Main(string[] args) {        DerivedEnum derivedEnumConvertedValue = BaseEnum.A.ToDerivedEnum();        Console.WriteLine("Derived converted value is " + derivedEnumConvertedValue);        BaseEnum baseEnumConvertedValue = DerivedEnum.B.ToBaseEnum();        Console.WriteLine("Derived converted value is " + baseEnumConvertedValue);            DerivedEnum.C.ToBaseEnum(); } Будет выводиться: Derived converted value is A Base converted value is B И тогда появится такое сообщение: "Cannot convert DerivedEnum.C value to BaseEnum type, since its integer value 2 is greater than the max value 1 of BaseEnum enumeration." Использование Visual Studio Extension для формирования наследования перечислений. Установите расширение NP.DeriveEnum.vsix Visual Studio из папки VSIX, дважды кликнув на файл. Откройте схему EnumDerivationWithCodeGenerationTest. Тип ее перечислений такой же, как и в предыдущей схеме: public enum BaseEnum {        A,        B } Посмотрите на файл "DerivedEnum.cs": [DeriveEnum(typeof(BaseEnum), "DerivedEnum")] enum _DerivedEnum {        C,        D,        E } Он определяет такой тип перечисления _DerivedEnum с атрибутом: [DeriveEnum (TypeOf (BaseEnum), "DerivedEnum")]. Атрибут определяет "супер-перечисления" (BaseEnum) и названия производного перечисления ("DerivedEnum»). Обратите внимание, что поскольку частичные перечисления не поддерживаются в C#, нам придется создать новый тип перечисления, объединив значение от "супер" до "суб" перечислений. Посмотрите характеристики файла DerivedEnum.cs, его "специальные инструменты (Custom Tool)" уже содержатся в "DeriveEnumGenerator": Теперь откройте файл DerivedEnum.cs в Visual Studio, попробуйте изменить его (скажем, добавив пробел) и сохраните его. Вы увидите, что сразу будет создан файл DerivedEnum.extension.cs: Этот файл содержит тип перечисления DerivedEnum, который объединяет все поля перечислений BaseEnum и _DerivedEnum. Для начала убедитесь, что они имеют одинаковое имя и полное значение, а также имеют соответствующие поля в исходных перечислениях: public enum DerivedEnum {        A,        B,        C,        D,        E, } Расширение VS также формирует статический класс DerivedEnumExtensions, содержащий методы преобразования между суб и супер перечислениями: static public class DerivedEnumExtensions {        public static BaseEnum ToBaseEnum(this DerivedEnum fromEnum)        {              int val = ((int)(fromEnum));              string exceptionMessage = "Cannot convert DerivedEnum.{0} value to BaseEnum - there is no matching value";              if ((val > 1))              {                     throw new System.Exception(string.Format(exceptionMessage, fromEnum));              }              BaseEnum result = ((BaseEnum)(val));              return result;        }        public static DerivedEnum ToDerivedEnum(this BaseEnum fromEnum)        {              int val = ((int)(fromEnum));              DerivedEnum result = ((DerivedEnum)(val));              return result;        } } Если использовать метод Program.Main (...), как и в предыдущем образце, получим достаточно похожий результат: static void Main(string[] args) {        DerivedEnum derivedEnumConvertedValue = BaseEnum.A.ToDerivedEnum();        Console.WriteLine("Derived converted value is " + derivedEnumConvertedValue);        BaseEnum baseEnumConvertedValue = DerivedEnum.B.ToBaseEnum();        Console.WriteLine("Base converted value is " + baseEnumConvertedValue);        DerivedEnum.C.ToBaseEnum(); } Вы можете указать значение поля как в суб, так и в супер перечислениях. Генератор кода достаточно развит для того, чтобы выдавать правильный код. Например, если мы поставим значение BaseEnum.B 20: public enum BaseEnum {        A,        B = 20 } И _DerivedEnum.C – 22: enum _DerivedEnum {        C = 22,        D,        E } Получим такой генерируемый код: public enum DerivedEnum {        A,        B = 20,        C = 22,        D,        E, } Метод расширения ToBaseEnum(...) также будет обновляться так, чтобы показывать исключение только тогда, когда мы пытаемся увеличить целое значение области DerivedEnum до 20: public static BaseEnum ToBaseEnum(this DerivedEnum fromEnum) {        int val = ((int)(fromEnum));        string exceptionMessage = "Cannot convert DerivedEnum.{0} value to BaseEnum - there is no matching value";        if ((val > 20))        {              throw new System.Exception(string.Format(exceptionMessage, fromEnum));        }        BaseEnum result = ((BaseEnum)(val));        return result; } Обратите внимание, что изменив значение первого поля суб-перечисления на меньшее или равное последнему полю супер-перечисления, генерация кода не осуществится, и это состояние будет отображаться, как ошибка. Например, попробуйте изменить значение _DerivedEnum.C на 20 и сохранить изменения. Файл DerivedEnum.extension.cs  будет отображаться в списке ошибок. Примечания о введении генератора объектного кода. Код ввода кода генерирования содержится в схеме NP.DeriveEnum. Основная схема NP.DeriveEnum была создана с помощью шаблона "Visual Studio Package" (также, как это было сделано при Implementing Adapter Pattern и Imitating Multiple Inheritance в C# с использованием системы Roslyn, основанной на VS Extension Wrapper Generator). Нам пришлось добавить пакеты Roslyn и MEF2, чтобы использовать функции Roslyn при таких командах, как "Nu Get Package Manager Console": Install - Package Microsoft.CodeAnalysis - Pre Install - Package Microsoft.Composition Класс main генератора называется DeriveEnumGenerator. Он вводит интерфейс IVsSingleFileGenerator. У интерфейса есть два метода - DefaultExtension(...) и Generate(...). Метод DefaultExtension(...) позволяет разработчику указать расширение генерируемого файла: public int DefaultExtension(out string pbstrDefaultExtension) {        pbstrDefaultExtension = ".extension.cs";        return VSConstants.S_OK; } Метод Generate(...) позволяет разработчику указать код, который входит в состав созданного файла:  public int Generate ( string wszInputFilePath, string bstrInputFileContents, string wszDefaultNamespace, IntPtr[] rgbOutputFileContents, out uint pcbOutput, IVsGeneratorProgress pGenerateProgress ) {        byte[] codeBytes = null;        try        {               codeBytes = GenerateCodeBytes(wszInputFilePath, bstrInputFileContents, wszDefaultNamespace);        }        catch (Exception e)        {              pGenerateProgress.GeneratorError(0, 0, e.Message, 0, 0);              pcbOutput = 0;              return VSConstants.E_FAIL;        }        int outputLength = codeBytes.Length;        rgbOutputFileContents[0] = Marshal.AllocCoTaskMem(outputLength);        Marshal.Copy(codeBytes, 0, rgbOutputFileContents[0], outputLength);        pcbOutput = (uint)outputLength;        return VSConstants.S_OK; } В данном случае генерация кода получена за счет метода GenerateCodeBytes (...).  protected byte[] GenerateCodeBytes(string filePath, string inputFileContent, string namespaceName) {        string generatedCode = "";        DocumentId docId =              TheWorkspace              .CurrentSolution              .GetDocumentIdsWithFilePath(filePath).FirstOrDefault();        if (docId == null)              goto returnLabel;        Project project = TheWorkspace.CurrentSolution.GetProject(docId.ProjectId);        if (project == null)              goto returnLabel;        Compilation compilation = project.GetCompilationAsync().Result;        if (compilation == null)              goto returnLabel;        Document doc = project.GetDocument(docId);        if (doc == null)              goto returnLabel;        SyntaxTree docSyntaxTree = doc.GetSyntaxTreeAsync().Result;        if (docSyntaxTree == null)              goto returnLabel;        SemanticModel semanticModel = compilation.GetSemanticModel(docSyntaxTree);        if (semanticModel == null)              goto returnLabel;        EnumDeclarationSyntax enumNode =              docSyntaxTree.GetRoot()              .DescendantNodes()              .Where((node) = > (node.CSharpKind() == SyntaxKind.EnumDeclaration)).FirstOrDefault() as EnumDeclarationSyntax;        if (enumNode == null)              goto returnLabel;        INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumNode) as INamedTypeSymbol;        if (enumSymbol == null)              goto returnLabel;        generatedCode = enumSymbol.CreateEnumExtensionCode(); returnLabel:        byte[] bytes = Encoding.UTF8.GetBytes(generatedCode);        return bytes; } Метод Generate (...) имеет доступ к C # в качестве одного из параметров. Мы используем такой способ, чтобы получить Id документа в системе Roslyn: DocumentId docId = TheWorkspace .CurrentSolution .GetDocumentIdsWithFilePath(filePath).FirstOrDefault(); Из документа Id можно получить идентификатор схемы, используя dockId. Из схемы Id получаем Roslyn Project от Rosly Workspace: Project project = TheWorkspace.CurrentSolution.GetProject(docId.ProjectId); Из Project получаем следующее: Compilation compilation = project.GetCompilationAsync().Result; Также получаем Roslyn Document: Document doc = project.GetDocument(docId); С данного документа получаем Roslyn SyntaxTree: SyntaxTree docSyntaxTree = doc.GetSyntaxTreeAsync().Result; С компиляции Roslyn и SyntaxTree образовывается семантическая модель: SemanticModel semanticModel = compilation.GetSemanticModel(docSyntaxTree); Вы также получите синтаксис перечисления в файле SyntaxTree: EnumDeclarationSyntax enumNode = docSyntaxTree.GetRoot() .DescendantNodes() .Where((node) = > (node.CSharpKind() == SyntaxKind.EnumDeclaration)).FirstOrDefault() as EnumDeclarationSyntax; Наконец, из SemanticModel и EnumerationDeclarationSyntax Вы можете вытянуть INamedTypeSymbol, соответствующий перечислению: INamedTypeSymbol enumSymbol = semanticModel.GetDeclaredSymbol(enumNode) as INamedTypeSymbol; INamedTypeSymbol очень похож на System.Reflection.Type. Практически всю информацию про тип С# можно получить от объекта INamedTypeSymbol. Метод расширения DOMCodeGenerator. CreateEnumExtensionCode() генерирует и возвращает весь код. generatedCode = enumSymbol.CreateEnumExtensionCode(); Другая часть кода, отвечающая за код генерации, входит в состав NP.DOMGenerator. Система Roslyn используется только для анализа, для генерации кода используется CodeDOM, так как он меньше по объему и удобнее. Есть два основных статических класса в программе NP.DOMGenerator: RoslynExtensions - для анализа Roslyn и DOMCodeGenerator - для генерирования кода, используя функции CodeDOM. Источник: http://www.codeproject.com/Articles/879129/Implementing-Enumeration-Inheritance-using-Roslyn
Notification success