Результати пошуку за запитом: начальный курс c
Тиждень великих знижок на ITVDN
Автор: Редакція ITVDN
Встречайте предновогодний сюрприз от ITVDN – в течение одной недели, с 5 по 12 декабря 2017 года, вас ждут большие скидки на подписку 6 и 12 месяцев. Вы можете изучать программирование на Javа, С#, JavaScript, Python, PHP, самые современные технологии и фреймворки, тратя на это всего $8.5 в месяц.
Долгосрочные подписки – это самый лучший выбор для тех, кто хочет пройти полное обучение по специальности и в итоге подтвердить свой уровень Дипломом специалиста.
В пакете подписки для Вас будут доступны более 130 курсов по программированию, с которыми вы можете ознакомиться в нашем каталоге.
Если Вы хотите пройти обучение по специальности Java Developer, Frontend Developer, Unity Game Dev, Вам лучше выбрать план подписки на полгода. Если же Ваша цель - стать С#/.NET или Full Stack разработчиком, Вам больше подойдет подписка на год. Вы сможете неоднократно возвращаться к пройденным курсам и сложным темам в течение года, консультироваться с тренером и формировать практические навыки, используя тренажер.
Выбирая подписку на 6 или 12 месяцев, вы получаете еще одно важное преимущество – все новые курсы будут доступны для вас сразу после их появления на ITVDN.
Используйте промо-коды для приобретения подписки по супeрцене:
5, 6, 7 декабря 2017 года
- подписка на год за $102 (промо-код 2017A40) подписка на 6 мес за $54 (промо-код 2017B40)
8, 9, 10 декабря 2017 года
- подписка на год за $110,5 (промо-код 2017A35) подписка на 6 мес за $58,5 (промо-код 2017B35)
11, 12 декабря 2017 года
- подписка на год за $119 (промо-код 2017A30) подписка на 6 мес за $63 (промо-код 2017B30)
Приобрести подписку по акционной цене
Spring Sale. Скидки до 50% на ИТ обучение
Автор: Редакция ITVDN
Друзья, поздравляем вас с приходом весны!
Весна является традиционным символом пробуждения, расцвета и решительных действий для лучшей жизни.
Мы очень рады всем, кто решается изменить свою жизнь и изучать программирование, потому что информационные технологии не только помогают нам быстрее и легче решать самые разные вопросы, но и позволяют получать достойное вознаграждение за свой труд.
Если вы готовы попробовать свои силы в IT, не упускайте возможность получить доступ ко всем видео курсам ITVDN со скидкой до 50%!
С 9 по 16 марта на ITVDN действуют скидки на пакеты "Базовый", "Премиум" и "Премиум Plus", которые предоставляют доступ ко всем курсам и сервисам ITVDN на 6 или 12 месяцев.
Но торопитесь - скидки будут постепенно уменьшаться, поэтому наилучшим предложением смогут воспользоваться именно те, кто оформит покупку 9, 10 и 11 марта.
Акционные цены с 9 по 11 марта:
Базовый (6 мес.) – 54 USD (89.99 USD)
Премиум (12 мес.) – 85 USD (169.99 USD)
Премиум Plus (12 мес.) – 100 USD (199.99 USD)
С 12 по 14 марта:
Базовый (6 мес.) – 59 USD
Премиум (12 мес.) – 102 USD
Премиум Plus (12 мес.) – 120 USD
15 и 16 марта:
Базовый (6 мес.) – 63 USD
Премиум (12 мес.) – 110 USD
Премиум Plus (12 мес.) – 130 USD
Изучение программирования – задача непростая, но очень перспективная! Вы можете вдохновить и поддержать себя, приобретая подписку со скидкой во время акции.
Какой пакет подписки выбрать?
Пакет «Базовый» – лидер продаж среди начинающих, он идеально подходит для тех, кто хочет за полгода пройти полное обучение по какой-то специальности и подтвердить свои знания соответствующими сертификатами.
Лучшая цена с 9 по 11 марта – 54 USD, доступ ко всем курсам предоставляется на 6 месяцев.
Пакет «Премиум» – это выгодное предложение как по цене, так и по набору услуг. Стоимость одного месяца обучения составляет всего 7 USD! Вы сможете овладеть несколькими направлениями или стать Full-stack разработчиком; также, уже устраиваясь на работу, использовать наш ресурс в качестве дополнительной базы знаний, позволяющей углублять и систематизировать ваши знания для более быстрого профессионального роста.
Лучшая цена с 9 по 11 марта – 85 USD, доступ ко всем курсам предоставляется на 12 месяцев.
Пакет «Премиум Plus» – самый лучший выбор в условиях блэкаута. Возможности те же, что и в "Премиум" подписке, но главное нововведение - возможность загружать видео уроки и просматривать их даже в условиях отсутствия света и интернета.
Лучшая цена с 9 по 11 марта – 100 USD, доступ ко всем курсам предоставляется на 12 месяцев.
Подарочные сертификаты со скидкой
Если вы хотите порадовать друга или близкого человека, желающего стать программистом, можете приобрести для него подарочный сертификат в период акции по акционной цене. Активировать его можно в любое время в течение года с момента приобретения сертификата.
Сроки акции: с 9 по 16 марта 2023 года включительно.
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
Шахова IT Арена для програмістів
Автор: Редакція ITVDN
Если ты силен в программировании и готов к сражению – докажи это в честном бою! Участвуй в Первой шахматной IT Арене на ITVDN.
Выбор оружия
В качестве оружия ты можешь выбрать один из 5 языков программирования: Python, C#, Java, C++ или Pascal.
Твои навыки составления алгоритмов: условия и логика, массивы и циклы, работа с битами и обработка данных, - проявят твоё мастерство!
Какие правила?
Состязания проходят в 4 тура. Начинаем в 9 июня (кстати, это Международный день друзей!) во время вебинара мы расскажем о правилах соревнований, ответим на все организационные вопросы и расскажем об условиях задач I тура.
На решение задач даётся 1 неделя, до начала следующего тура. На следующих вебинарах 16, 23, 30 июня и 7 июля - мы рассмотрим решения задач, определим победителей очередного тура и расскажем об условиях новых задач.
Какие задачи?
Все задания связаны с шахматными алгоритмами. Шахматы скрывают в себе огромный объём интересных методик. Есть как простые задачи, так и сложные, каждый найдёт для себя новое и интересное. В конце каждого тура мы вместе решим каждую задачу - вы получите отличный опыт и знания!
Ты прокачаешь свои навыки решения задач и составления алгоритмов, работы со структурами данных и составления логических конструкций.
Если ты примешь активное участие во всех турах, то получишь не только ценный опыт, но и напишешь свой собственный генератор ходов для любой шахматной позиции!
Программа состязаний:
Первый тур - 9 июня в 19:00. Доска, фигуры и ходы. Задания первого тура принимаются до 12:00 часов 16 июня.
Второй тур - 16 июня в 19:00. Конь, слон, ладья и ферзь. Итоги первого тура и постановка задач второго тура. Решения принимаются до 12:00 23 июня.
Третий тур - 23 июня в 19:00. Проходная пешка и рокировка. Итоги второго тура.
Четвертый тур - 30 июня в 19:00. Шах. Мат. Пат. Ничья. Регистрация новых участников. Для решения задач перейдите по ссылке.
Финал - 7 июля в 19:00. Определение победителей.
Внимание! Новые участники могут присоединиться к соревнованию на любом этапе. Повторные регистрации не нужны.
Полезные ссылки
Вход в интерактивный сборник задач: https://itvdn.com/ru/start-practice
Редактор шахматной доски с FEN-кодом: https://lichess.org/editor
А судьи кто?
С самого начала и до конца с вами на IT Арене бессменный ведущий, судья, программист и шахматист - Евгений Волосатов!
Профессиональный программист. Автор видеокурсов по C#, Java, PHP. 20 лет опыта ведущим программистом в разных компаниях, а также преподавания в университете и колледже. С 2013 года ведет вебинары и записывает видеокурсы.
Награды победителям
В каждом туре будут определены победители. Каждый понедельник мы будем обновлять турнирную таблицу, чтобы имена лучших были известны всем!
Победителями Шахматной IT Арены станут участники, которые наберут суммарно максимальное количество баллов за правильное решение всех заданий.
Всех победителей ждут призы и подарки, подробнее о них мы расскажем на первой встрече!
Награждены будут лучшие участники каждого тура и финалисты.
Смотрите видео приглашение от Евгения Волосатова.
Регистрируйтесь сами и приводите друзей. Это будет круто!
Підсумки першого туру зимового С# Марафону
Автор: Редакція ITVDN
C 17 по 23 января 2019 года на ITVDN проходил первый тур зимнего C# Марафона!
В первом туре C# Марафона приняли участие 324 человека. Из них 83 успешно на 100% выполнили все задания.
Имена победителей первого тура и результаты:
Макеев Олег - 675 баллов/40 попыток, сертификат TP58233506
Агафонов Иван - 675 баллов/40 попыток, сертификат TP4621610
Евтеев Иван - 675 баллов/40 попыток, сертификат TP00334941
Михайло Баран - 675 баллов/40 попыток, сертификат TP95210208
Аксенов Алексей - 675 баллов/40 попыток, сертификат TP60617045
Родин Андрей - 675 баллов/40 попыток, сертификат TP99198895
Варов Алексей - 675 баллов/40 попыток, сертификат TP49067965
Нигматулин Руслан - 675 баллов/40 попыток, сертификат TP52324621
Давыдов Максим - 675 баллов/40 попыток, сертификат TP52825213
Derevyanko Andrey - 675 баллов/40 попыток, сертификат TP02961868
Подарочные сертификаты на 1 месяц подписки будут отправлены победителям первого тура 25 февраля 2019 года на емейлы, указанные в регистрационной форме.
Второй тур соревнований будет значительно сложнее, потому что заданий в 2 раза больше! Он также продлится 7 дней – с 24 по 30 января включительно. Участникам соревнования нужно будет выполнить все 90 заданий тренажера и пройти онлайн-тестирование по С# Essential. Итоги второго тура будут объявлены 31 января 2019 года. Форма регистрации результатов второго тура будет открыта до 18:00 30 января.
Награда победителям второго тура
Трое участников второго тура марафона, чьи результаты будут наилучшими, получат в подарок подписку на три месяца.
Поздравляем победителей первого тура марафона!
Список участников марафона, которые прошли во второй тур:
Kovlov Alex
Варов Алексей
Нигматулин Руслан
Давыдов Максим
Kapustin Vladimir
Derevyanko Andrey
Сидоров Андрей
Аксенов Алексей
Родин Андрей
Коцаб'юк Микола
Баданин Максим
Афанасьев Сергей
Макеев Олег
Агафонов Иван
Евтеев Иван
Баран Михайло
Suvorov Alexandr
Kulikov Kirill
Никита Корнев
Ilya Kolomeets
Пархоменко Андрей
Havryliuk Maksym
Стратила Денис
Semenova Mariya
Barinova Anastasia
Лукин Виктор
Koch Anna
Ягур Алексей
Кушнир Прохор
Деревянко Андрей
Vlasov Alexander
Гергало Александр
Стижко Максим
Демонов Алексей
Несмашный Валерий
Шипотько Артем
Веселов Дмитрий
Ахметшин Айдар
Масленников Владимир
Ivan Mariychuk
Burdin Anton
Vorobyov Alexey
Skipa Alexander
Коваленко Олександр
Яворський Олег
Барановская Елизавета
Гудков Игорь
Брага Роман
Потапов Вячеслав
Aliaksandr Babtsou
Лукина Анастасия
Пляцик Юрчик
Радышевский Максим
Оляніна Надія
Угрюмов Виктор
Пилюгин Иван
Рыбалко Ирина
Петров Антон
Ayvazyan Menua
Tba Tbaputet
Boyko Ivan
Лушкин Иван
Шалыганов Дмитрий
Швец Александр
Kivich Vlad
Vyacheslav Karpov
sdjnklasd jsuvsjkgas
Марченко Юрий
Антонов Дмитрий
Паршин Александр
Sh Timur
Kantyshev Anton
Козорезов Алексей
Панов Константин
Сергей Ларин
Пинчук Виталий
Vadym Filyushyn
Bychkov Ihor
Сивков Александр
Серкова Екатерина
Галамага Евгений
Ермолаева Диана
Djanibekov Jahongir
Введення в розробку програм під iOS. Частина 6
Автор: Volodymyr Bozhek
Здравствуйте, дорогие читатели.
В этом уроке мы:
Установим менеджер установки пакетов “Brew”;
Научимся пользоваться базой данных “Mongo DB” и изучим библиотеку “Mongoose”;
Установим и сконфигурируем базу данных “Mongo DB”;
Научимся запускать демон (службу) “Mongod” и подключаться к ней;
Научимся просматривать документы базы данных “Mongo DB” с помощью приложения “Robomongo”;
Создадим REST сервисы для товаров и пользователей с использованием “NodeJS”;
Научимся тестировать REST сервисы с помощью расширения “Chrome” браузера “Postman”;
Итак, вы скорее всего задались вопросом, почему же я выбрал именно такие технологии для написания REST сервисов. Почему не выбрал то, что уже давно у всех на слуху, такие технологии как Web API + Entity Framework. Ответ прост, я выбрал ровно те технологии, которые явно подходят платформе, на которой мы ведем разработку macOS.
Да, можно было установить Xamarin Community Edition, в нем создать ASP.NET проект и сделать сервисы на Mono.NET.
Еще был вариант сделать сервисы на виндовс платформе, развернутой на виртуальной машине в веб сервере IIS с сетевым адаптером мост. Это для того, чтобы веб сайт и сервисы были доступны на хостовой машине macOS в браузере.
Возможно, в одном из моих будущих видео курсов по разработке iOS приложений я буду использовать именно платформу Windows и Visual Studio для разработки REST сервисов.
Но в этом уроке мы будем делать сервисы на NodeJS, и вы сами убедитесь в том, насколько это просто и как мало кода надо для этого написать :)
В качестве среды разработки я буду использовать WebStorm, он довольно хорошо себя оправдал как один из продуктов JetBrains.
В этом уроке мы не будем работать с приложением “Warehouse” под iOS, поскольку мы должны приступить к изучению библиотеки “Alamofire”. А для нее необходимы REST сервисы, которых у нас сейчас нет. Показывать работу на всяких httpbin, parse и других сервисах тестирования я не буду, этого полно в сети интернет, вы и сами будете видеть это в поиске нужной вам информации.
“Alamofire” - это асинхронная сетевая библиотека для работы с REST сервисами. В большинстве туториалов не рассказывается, как сделать REST сервисы и клиент к ним на разных платформах.
Мне хотелось бы нарушить этот стереотип и предоставить вам учебные примеры по созданию полнофункционального REST сервиса и полнофункционального iOS клиента в составе приложения “Warehouse” к нему. Проще говоря, дать готовое решение для быстрого понимания, что и как делается.
Это то, чего обычно не хватает новичкам и то, чего обычно нигде не выкладывают. Приходится самостоятельно разбираться и искать нужную информацию.
Откройте “WebStorm”. Выберите в меню “File -> New Project”. Выделите тип проекта “Node.js Express App”.
В поле “Location” укажите название проекта “Warehouse” и путь, по которому вы будете сохранять данный проект.
В поле “Template” выберите “EJS”. Нажмите кнопку “Create”.
Вы увидите диалоговое окно с предложением, откуда взять библиотеку “NodeJS”.
Оставьте пункт по умолчанию “Download from the Internet” и нажмите кнопку “Configure”.
Будет загружен из сети интернет “NodeJS”, “Express” и другие библиотеки.
Панель навигации будет выглядеть у вас так:
Рассмотрим, что создал нам данный шаблон.
В папке “bin” хранится файл “www”, в нем находится настройка сервера “NodeJS”, с этого файла происходит запуск нашего сервера.
В папке “node_modules” находятся библиотеки, которые были автоматически загружены шаблоном проекта NodeJS.
В папке “public” находятся ресурсы, используемые нашим сервером (картинки, CSS стили, скрипты).
В папке “routes” находятся скрипты, которые должны содержать маршрутизацию относительно текущего URL, введенного пользователем.
Например, файл с именем “users.js” вызывется, когда пользователь введет в браузере URL: “http://localhost:{port}/users”.
Файл “index.js” вызывется, когда пользователь введет URL: “http://localhost:{port}”.
Если сравнивать с паттерном MVC (Model View Controller), то в папке “routes” находятся “контроллеры”.
В папке “views” находятся представления. Расширение “*.ejs” говорит о том, что содержимое данного файла будет транслироваться через библиотеку “Express JS”.
Данная библиотека создана в помощь, чтобы можно было проще создавать маршрутизацию в NodeJS и проще создавать пользовательский интерфейс.
Внутри этих файлов “*.ejs” содержится обычная “HTML” разметка. Файл маршрутизации и файл представления должны называться одинаково, если они будут связаны.
В текущем проекте связаны только “index.js” и “index.ejs”. Маршрут “users.js” не имеет явного представления, для него преставление генерируется средствами “NodeJS”.
Наша задача создать только REST сервисы, поэтому работу с “EJS” мы не будем рассматривать в данном уроке.
Рассмотрим содержимое файла “www” в папке “bin”.
На 7 строке через библиотеку “Require JS” мы подключаем содержимое модуля “app.js” в текущий исполняемый модуль “www” и запускаем это содержимое на исполнение.
В файле “app.js” содержатся настройки для работы нашего сервера.
На 8 строке мы задаем режим отладки для нашего сервера.
На 9 строке мы подключаем модуль “http” для работы с HTTP запросами.
На 15 строке задается порт “3000”, на этом порту сервер будет принимать входящие запросы к нему.
На 16 строке устанавливает этот порт для свойства “port” сервера.
На 22 строке создается сервер на основе настроек экземпляра “app”.
На 28 строке сервер запускается и начинает прослушивание на порту “3000”.
На 29 строке привязывается функция “onError”, вызываемый при возникновении ошибок.
На 30 строке привязывается функция “onListening”, вызываемая при начале прослушивания запросов сервером.
Остальной код в данном модуле не представляет для нас интереса.
Чтобы запустить приложение, выполните в меню “Run -> Run bin/www”, сервер запустится.
Затем откройте браузер и введите URL: “http://localhost:3000”, вы увидите приветствие.
Чтобы остановить сервер, выполните в меню “Run -> Stop”.
Теперь необходимо установить базу данных “Mongo DB”. Подробнее об установке вы можете прочитать тут. Проще всего устанавливать базу данных через менеджер пакетов “Brew”.
Давайте установим его. Перейдите в браузере по адресу, на сайте будет предложено скопировать строку “/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” в терминал.
Откройте терминал и скопируйте в него строку установки “Brew”. После установки вы увидите следующее:
Теперь необходимо установить базу данных “Mongo DB”. Установка базы данных через “Brew” проще тем, что “Brew” сам заполняет нужные переменные среды окружения и вам не надо этого делать вручную в случае с установкой базы данных вручную.
Перейдите в “WebStorm”, откройте внутри него терминал. И введите команду “brew install mongodb && mongod”, данная команда скачает и установит “Mongo DB”, а также выполнит настройки по умолчанию для демона “mongod”.
Выполните в терминале команду “sudo mkdir -p /data/db”. Введите свой пароль и нажмите кнопку “Enter”. Данная команда создаст папку “data” и в ней папку “db”, эта папка используется по умолчанию для добавления базы данных “Mongo DB”.
Команда “sudo” используется, чтобы выполнить остальную часть команды от имени администратора.
Теперь необходимо установить в наш проект библиотеку “Mongoose” для осуществления возможности работы с базой данных их кода приложения сервера .
Выполните в терминале команду “npm install mongoose”. Документацию по этой библиотеке можно почитать тут:
Данную команду мы выполняли через встроенный в NodeJS менеджер пакетов, так как устанавливаем данную библиотеку исключительно для нашего проекта, а не глобально.
Откройте терминал, введите команду “mongod”.
Данная команда запускает сервер базы данных “Mongo DB”, который принимает входящие подключения на порту “27017”. На картинке выше вы можете в этом убедиться “waiting for connections on port 27017”.
Демон запустили, теперь перейдите в “WebStorm”, в терминале внутри введите команду “mongod –version”, вы увидите версию базы данных “Mongo DB”, которая была установлена на ваш компьютер.
Теперь необходим клиент с GUI для работы с базой данных. Откройте браузер, перейдите по адресу, нажмите кнопку “Download”, скачайте и установите приложение.
После установки приложения откройте его. Нажмите на иконку:
Откроется приложение “Robomongo”.
Нажмите кнопку “Connect to local or remote Mongo DB instance”. Откроется диалоговое окно подключения к базе данных.
Нажмите кнопку “Create”. Откройте диалоговое окно настройки подключения к базе данных.
Заполните настройки, как показано на картинке выше и только на вкладке “Connection”, нажмите кнопку “Save”. После этого в окне “Mongo DB connections” у вас появится добавленное подключение. Выделите его и нажмите кнопку “Connect”.
Нажмите правой кнопкой в панели навигации по “Warehouse” и в контекстном меню выберите пункт “Create Database”.
В поле “Database Name” введите “warehouse”, нажмите кнопку “Create”.
На картинке выше видно, что база данных “warehouse” была успешно добавлена.
Супер :)
Теперь надо добавить в проект модель и схему базы данных, они создаются с помощью библиотеки “Mongoose”.
Перейдите в “WebStorm”. В панели навигации, нажмите правой кнопкой по “Warehouse”, в контекстном меню выберите “New -> Directory”. Создайте папку с именем “models”.
Создайте в папке “models” модули “Product.js” и “User.js”. А в папке “routes” создайте модули “auth.js”, “products.js”.
Откройте модуль “Product.js”, заполните его, как показано на картинке ниже:
На 1 строке мы подключаем библиотеку “mongoose” и создаем ее экземпляр с именем “mongoose”.
На 2 строке мы правым операндом создаем схему таблицы товаров и присваиваем ее левому операнду с именем “ProductSchema”. Таблица товаров содержит поля:
скрытое поле “_id”, типа “String”, в этом поле содержится уникальный идентификатор строки.
скрытое поле “__v”, типа “Number”, в этом поле содержится версия API по умолчанию 0. Версия API нужна для того, чтобы можно было менять реализацию сервисов и иметь несколько версий для обратной совместимости.
поле “productImage”, типа “String”, тут будет храниться название картинок из нашего проекта под iOS, названия от “tool001” до “tool012”.
поле “productName”, типа “String”, тут будет храниться название товара.
поле “productDescription”, типа “String”, тут будет храниться описание товара.
На 7 строке мы правым операндом создаем экземпляр модели с именем “Product” и указываем создать экземпляр на основе схемы, описанной в экземпляре “ProductSchema”. Библиотека “mongoose” создает данный экземпляр и присваивает его левому операнду.
Свойство “exports” содержит экземпляры объектов, которые будут доступны из модуля при подключении его через библиотеку “Require JS”.
Откройте модуль “User.js”, заполните его, как показано на картинке ниже:
На 1 строке мы подключаем библиотеку “mongoose” и создаем ее экземпляр с именем “mongoose”.
На 2 строке мы правым операндом создаем схему таблицы товаров и присваиваем ее левому операнду с именем “UserSchema”. Таблица пользователей содержит поля:
скрытое поле “_id”, типа “String”, в этом поле содержится уникальный идентификатор строки.
скрытое поле “__v”, типа “Number”, в этом поле содержится версия API по умолчанию 0. Версия API нужна для того, чтобы можно было менять реализацию сервисов и иметь несколько версий для обратной совместимости.
поле “userName”, типа “String”, тут будет храниться логин пользователя.
поле “userPwd”, типа “String”, тут будет храниться пароль пользователя.
поле “userDesc”, типа “String”, тут будет храниться описание пользователя.
На 7 строке мы правым операндом создаем экземпляр модели с именем “User” и указываем создать экземпляр на основе схемы, описанной в экземпляре “UserSchema”. Затем присваем созданный экземпляр свойству “exports” данного модуля.
Откройте модуль “auth.js”, заполните его в соответствии с содержимым ниже:
На 1 строке подключаем модуль “express” и создаем его экземпляр с именем “express”.
На 2 строке создаем экземпляр маршрутизатора запросов с именем “router”.
На 3 строке подключаем модуль “User.js” и создаем его экземпляр с именем “User”.
На 4 строке строим маршрут типа “http://localhost:3000/auth/”.
На экземпляре “router” вызываем функцию “post”. Вызов данной функции говорит, что созданный с помощью него маршрут будет доступен только через HTTP глагол POST. Первым аргументом задаем маршрут, вторым аргументом задаем функцию обработчик, который будет вызван при переходе по данному маршруту с учетом заданного HTTP глагола. Т.е. когда пользователь отправит POST запрос по адресу.
Функция обработчик принимает три аргумента.
Первый аргумент “request” содержит экземпляр запроса по данному маршруту. Второй аргумент “response” содержит экземпляр ответа по запросу по данному маршруту. В этот экземпляр можно добавлять любой ответ, который вы хотите, чтобы пользователь получил.
Третий аргумент “next” содержит текущий итератор в стеке запросов по маршрутизации. Данный экземпляр необходим, чтобы была возможность перейти на следующую итерацию в стеке маршрутизации.
Сам по себе сервер NodeJS работает асинхронно и никогда никого и ничего не ждет, это нужно учитывать при работе с ним.
На 5 строке мы выводим сообщение на консоль.
На 6 строке мы на экземпляре “User” вызываем функцию “find”, в которую единственным аргументом передаем специальную функцию обработчик, в которой будет содержаться результат данной операции. Функция “find” получает все записи из таблицы “User” и присваивает их в JSON формате второму аргументу функции обработчика с именем “data”.
Для примера, в “data” может содержаться такой JSON:
“[{_id:'789787sdfsd78sdfsd7', __v:0, userName: “Test1”,...},{_id:'4444447sdfsd78sdfsd7', __v:0, userName: “Test2”,...}]”.
Где квадратные скобки - это массив, а в фигурных скобках - это экземпляр JSON.
В аргументе “err” содержится экземпляр ошибки, если произошла ошибка при выполнении данной функции “find”.
На 7 строке мы создаем экземпляр объекта с именем “res”, данный объект содержит свойство “Error”, которое инициализировано значением по умолчанию “Authorization Error”. Как вы уже поняли, это текст ошибки, который вернется на клиент в случае ошибки авторизации клиента.
На 8 строке мы проверяем, если при получении данных через функцию “find” произошла ошибка и аргумент “err” не содержит значение “undefined”, мы обращаемся к экземпляру “next” и говорим серверу выполнить следующую итерацию маршрутизации и вернуть ошибку на клиент. На клиент средствами NodeJS будет возвращена “Stack Trace” ошибки.
На 9 строке, если ошибки не было, мы выполняем цикл foreach по массиву JSON объектов “data”. В функцию “forEach” передается специальная функция, которая содержит три аргумента.
Первый аргумент “item” содержит текущий итерируемый экземпляр JSON.
Второй аргумент “i” содержит позицию итератора и имеет тип Number.
Третий аргумент “data” содержит исходный массив объектов JSON, по которым проводится итерация.
На 10 строке мы задаем условие поиска пользователя по его имени и паролю в списке всех пользователей полученной функцией “find”. В условии сравниваются имя и пароль, которые пришли в POST запросе на сервер, с именем и паролем, полученным от функции “find”.
На 12 строке, если пользователь был найден, мы присваиваем экземляру “res” JSON объект найденного пользователя.
На 15 строке мы обращаемся к экземпляру ответа “response”, вызываем на нем функцию “json”, которая принимает данные и возвращает ответ на клиент в JSON формате. В аргумент данного метода мы передаем или экземпляр найденного пользователя, или экземпляр ошибки, что пользователь не найден и авторизация не удалась.
На 18 строке мы экспортируем из модуля экземпляр маршрутизации “router”.
Откройте модуль “index.js”. Заполните его в соответствии с содержимым ниже:
На 1 строке подключаем модуль “express” и создаем его экземпляр с именем “express”.
На 2 строке создаем экземпляр маршрутизатора запросов с именем “router”.
На 3 строке строим маршрут типа “http://localhost:3000/index/”, доступный через HTTP глагол GET.
На 4 строке, на экземпляр ответа вызываем функцию “render”. Данная функция возьмет представление, указанное в первом аргументе функции и вернет его на сторону клиента. Вторым аргументом задается словарь, в который можно добавить свойства со значениями, к которым можно будет обращаться со стороны представления.
На 6 строке мы экспортируем из модуля экземпляр маршрутизации “router”.
Откройте модуль “index.ejs”. Заполните его в соответствии с содержимым ниже:
Библиотека Express JS позволяет нам обращаться к свойствам, которые мы указали во втором аргументе метода “render” путем добавления следующей конструкции “<%= Название_Свойства %>”. На этапе отрисовки страницы данные конструкции будут заменены на значение указанного свойства.
Откройте модуль “products.js”, заполните его в соответствии с содержимым ниже:
На 1 строке подключаем модуль “express” и создаем его экземпляр с именем “express”.
На 2 строке создаем экземпляр маршрутизатора запросов с именем “router”.
На 3 строке подключаем модуль “Product.js” и создаем его экземпляр с именем “Product”.
На 4 строке строим маршрут типа “http://localhost:3000/products/”. Данный маршрут будет доступен по HTTP глаголу GET.
На 5 строке мы вызываем на экземпляре “Product” функцию “find”. Внутри функции мы проверяем, были ли ошибки, и возвращаем в ответе JSON массив со списком всех товаров.
На 10 строке строим маршрут типа “http://localhost:3000/products/”. Данный маршрут будет доступен по HTTP глаголу POST.
На 11 строке мы вызываем на экземпляре “Product” функцию “create”. Внутри функции мы проверяем, были ли ошибки, и возвращаем в ответе JSON объект успешно созданного товара.
На 16 строке строим маршрут типа “http://localhost:3000/products/{_id}” (например, “http://localhost:3000/products/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу GET.
На 17 строке мы вызываем на экземпляре “Product” функцию “findById”. Из названия функции ясно, что функция выполняет поиск по идентификатору товара. Для поиска используется скрытое поле “_id” в модели “Product”, объявленной в модуле “Product.js”. Внутри функции мы проверяем, были ли ошибки, и возвращаем в ответе JSON объект успешно найденного товара.
На 23 строке строим маршрут типа “http://localhost:3000/products/{_id}” (например, “http://localhost:3000/products/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу PUT.
На 24 строке мы вызываем на экземпляре “Product” функцию “findByIdAndUpdate”. Из названия функции ясно, что выполняется поиск товара по его идентификатору “_id”, затем, в случае если найден, обновляются все его поля, кроме скрытых полей. В ответе возвращается JSON объект успешно обновленного товара.
На 30 строке строим маршрут типа “http://localhost:3000/products/{_id}” (например, “http://localhost:3000/products/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу DELETE.
На 31 строке мы вызываем на экземпляре “Product” функцию “findByIdAndRemove”. Из названия функции ясно, что выполняется поиск товара по его идентификатору “_id”, затем, в случае если найден, товар удаляется. В ответе возвращается удаленный JSON объект.
Откройте модуль “users.js”, заполните его в соответствии с содержимым ниже:
В модуле “users.js” я не вижу смысла расписывать подробно, что происходит, поскольку тут все то же самое, что и происходило в модуле “products.js”, рассмотренном выше. Разница только в том, что мы используем другую модель данных “User”. Опишу только доступные маршруты.
На 4 строке строим маршрут типа “http://localhost:3000/users/”. Данный маршрут будет доступен по HTTP глаголу GET.
На 10 строке строим маршрут типа “http://localhost:3000/users/”. Данный маршрут будет доступен по HTTP глаголу POST.
На 16 строке строим маршрут типа “http://localhost:3000/users/{_id}” (например, “http://localhost:3000/users/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу GET.
На 23 строке строим маршрут типа “http://localhost:3000/users/{_id}” (например, “http://localhost:3000/users/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу PUT.
На 30 строке строим маршрут типа “http://localhost:3000/users/{_id}” (например, “http://localhost:3000/users/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу DELETE.
Откройте модуль “app.js”, обновите его в соответствии с содержимым ниже:
Конкретно в модуль “app.js” были внесены следующие изменения.
С 8 по 11 строку были подключены модули “index.js”, “users.js”, “products.js”, “auth.js”.
На 13 строке был подключен модуль “mongoose”.
На 14 строке мы задаем свойство “Promise” в значение “global.Promise”, чтобы начать обмениваться сообщениями с базой данной “Mongo DB”.
На 15 строке мы подключаемся к базе данных “Mongo DB” c названием “warehouse”, мы ее ранее создавали в приложении “Robomongo”. Источник данных “mongodb://localhost/warehouse” можно разбить так: “mongodb://” протокол взаимодействия (аналоги “http://”, “tcp://”, “file://”). “localhost” - это адрес машины, на которой хостится база данных. “warehouse” - имя базы данных.
На 16 строке метод “then” вызывается в случае успешного подключения к базе данных.
На 17 строке метод “catch” вызывается в случае сбоя подключения к базе данных.
С 33 по 36 строку мы задаем доступные глобальные маршруты, которые будет обрабатывать сервер. Надеюсь, все помнят разницу между сервером и сервисами, это не одно и то же.
Сервер - это просто приложение, которое внутри себя способно содержать различные ресурсы. Сервер может запускать внутри себя различные потоки для обработки данных.
Сервис - это функционал, который как раз запускается в отдельном потоке внутри сервера.
Сам по себе сервис без наличия приложения ,в котором его можно разместить, работать не будет. В случае с WebAPI сервером является Microsoft IIS или отдельно стоящее исполняемое приложение с функцией self хостинга.
Мы закончили написание сервера. Запустите демон “mongod” в терминале.
Запустите сервер. Вы увидите обновленное приветствие.
Я бы рекомендовал вам прослушать курс “Angular JS”, автор Дмитрий Охрименко. Это один из лучших курсов, которые я когда-либо слушал. После данного курса вы без особых проблем сможете сделать клиентскую часть для сервера на “Angular JS”.
Теперь давайте научимся тестировать наши REST сервисы. Тестировать сервисы можно и через Fiddler, но на macOS у него есть проблемы с отрисовкой и работой. Поэтому откройте браузер и перейдите по адресу.
“Postman” - это аналог “Fiddler”, доступный в качестве расширения для браузера “Google Chrome”.
После установки расширения “Postman” откройте его.
Выполним первый запрос к сервису “users” по HTTP глаголу GET.
Заполните поле адрес, выберите глагол “GET”, нажмите кнопку “Send”. Результат придет - пусто. Обратите внимание, что в терминале “WebStorm” тоже пишется логирование вызовов при обращения к сервисам.
Откройте приложение “Robomongo”, подключитесь к базе данных. Разверните папку “Collections” базы данных “warehouse”, выполните щелчок правой кнопкой мыши по таблице “users”, в контекстном меню выберите “View Documents”. В “Mongo DB” нет колонок, там есть всего одна колонка, в которой хранится JSON объект. Строки называются документами. Причем, в каждую строку одной таблицы можно класть абсолютно разный по структуре JSON объект. База данных позволяет такую операцию.
Видим, что данных нет, это не удивительно, ведь мы еще ничего не добавляли.
Давайте добавим. Перейдите в “Postman”, выберите глагол “POST”.
Выберите “Content-Type” - “x-www-form-urlencoded”. Внимание, через другие типы “form-data” “raw” работать не будет. Заданные свойства “userName”, “userPwd”, “userDesc” будут отправлены в запросе как JSON объект “{ userName: 'admin', userPwd: 'abc123!', userDesc: 'Administrator' }”. Нажмите кнопку “Send”. Придет ответ:
В ответе мы видим JSON объект модели “User”, созданной на сервере.
Перейдите в приложение “Robomongo”, выполните пункт контекстного меню “View Documents” на таблице “users”.
Отлично, у нас появился первый пользователь :)
Перейдите в “Postman”, выберите HTTP глагол “GET”. Нажмите кнопку “Send”. Вы увидите такой результат.
Обратите внимание на квадратные скобки, в ответе пришел массив JSON объектов, а не один объект.
Теперь давайте изменим пароль пользователю “admin”, на “12345678”. Нам понадобится идентификатор пользователя, выделите и скопируйте значение свойства “_id”.
Выберите HTTP глагол “PUT”. Обновите данные так, как показано ниже.
Обратите внимание на добавление идентификатора пользователя после основного маршрута “../users/”. Нажмите кнопку “Send”. В ответе получим старый JSON объект до внесения изменений.
Теперь для того, чтобы посмотреть измененный объект, воспользуемся сервисом , который возвращает пользователя по его идентификатору “_id”. Выберите HTTP глагол “GET”, обновите адрес, добавьте в конец адреса идентификатор пользователя. Нажмите кнопку “Send”. Получим такой результат.
Видим, что пароль пользователя был успешно обновлен и мы получили в ответе один JSON объект, а не массив пользователей.
Теперь попробуем удалить пользователя. Адрес оставьте тот же. Выберите HTTP глагол “DELETE” и нажмите кнопку “Send”.
Видим, что в ответе содержится JSON объект удаленного пользователя.
Теперь проверим, доступен ли пользователь после удаления. Адрес оставьте тот же. Выберите HTTP глагол “GET”, нажмите кнопку “Send”.
Видим, что пользователь действительно был удален. Также можете проверить это в приложении “Robomongo”.
Теперь приступим к тестированию сервиса “products”.
Получим список товаров.
Товаров нет. Добавим первый товар.
Обновим описание товара.
Получим обновленный товар по его идентификатору.
Удалим товар.
На этом мы завершаем урок.
К данной статье прикреплен архив с готовым сервером на NodeJS , в помощь учащимся :)
На следующем уроке мы:
выполним рефакторинг проекта “Warehouse” под “iOS”;
научимся пользоваться CollectionViewController;
научимся пользоваться библиотекой “Alamofire”, в конце урока будут доступны исходники полноценного рабочего приложения;
научимся сохранять объекты в настройки телефона и извлекать их;
реализуем функциональность для работы со всеми сервисами, созданными в данном уроке;
добавим представление регистрации;
добавим представление редактирования пользователей.
Материалы к статье тут.
Які шанси у програміста-початківця знайти роботу?
Автор: Редакція ITVDN
Вопросы, которые беспокоят каждого начинающего разработчика – смогу ли я найти работу после того, как пройду обучение? Какую специальность лучше выбрать, чтобы наверняка быть нужным?
Есть, много субъективных факторов, которые влияют на возможность получить ту работу, о которой вы мечтаете. Это настойчивость, готовность рискнуть, черты характера, навыки представления себя потенциальному работодателю, умение правильно выбрать компанию и вакансию, соответствующие вашему уровню, умение проходить собеседование. При равных знаниях в программировании шансы кандидатов не равны.
Однако, есть и объективные факторы, которые вы можете (и должны!) учитывать. Один из них – конкуренция среди программистов, желающих занять определенную вакансию в IT компании.
Самый простой способ взвесить свои шансы – посмотреть на количество вакансий, опубликованных в течение месяца и количество откликов на эти вакансии. Такая информация всегда в свободном доступе на сайте сообщества программистов Украины DOU.UA.
Мы сделали небольшую выборку по десяти специальностям. Это информация за май 2018 года.
Информация, представленная в этой таблице, говорит о том, сколько специалистов откликнулись на вакансии и какие специальности в нынешние время самые популярные. Из таблицы явно видно, что у начинающего C#/.NET разработчика шансы получить работу намного выше, чем у Java или FrontEnd разработчика. Смотрите, думайте. Желаем Вам стать профессионалом и работать в компании Вашей мечты!
С более подробной информацией Вы можете ознакомиться на сайте DOU.UA.
Добірка кращих вебінарів про різні напрямки в IT
Автор: Редакція ITVDN
Друзі, як вам відомо, вже майже місяць ми надаємо безкоштовний доступ до усіх відео курсів ITVDN для громадян України. Цією пропозицією наразі скористалися понад 12 тисяч українців. Здебільшого це люди, які втратили роботу через війну і зараз намагаються оволодіти новою професією.
Ми отримуємо багато запитань про те, яку мову програмування обрати, яка IT спеціальність є більш перспективною, скільки потрібно часу, щоб вивчити основи та отримати першу роботу в IT.
Відповіді на всі ці питання ви знайдете у добірці вебінарів від наших найкращих спікерів. Сподіваємось, що це допоможе вам у виборі напряму професійного розвитку.
Як вивчити FrontEnd та влаштуватися на роботу. Автор – Дмитро Охріменко. Дивитись
Roadmap React розробника. Автор – Олег Мельничук. Дивитись
Як стати C# розробником. .NET чи .NET Core. Автор – Дмитро Охріменко. Дивитись
Як стати SQL розробником або Data інженером. Автор – Михайло Пудеян. Дивитись
Як стати Java розробником. Автор – Максим Федосов. Дивитись.
Карта спеціальності Java розробник. Автор – Андрій Бондаренко. Дивитись
Тренди Android розроблення у 2022 році. Автор – Бондаренко Андрій. Дивитись
Як стати iOS розробником у 2022 році. Автор – Андрій Добиш. Дивитись
Як стати Python розробником. Автор – Артем Мураховський. Дивитись
Хто такий Data Scientist? Автор – Ілля Іорин. Дивитись
Як стати Full-Stack розробником. Автор – Віталій Ємець. Дивитись
Як стати Project менеджером. Автор – Дмитро Крохмалюк. Дивитись
На ITVDN є комплексні програми навчання з 20 спеціальностей – обирайте, що вам до вподоби.
10% доходу ми переказуємо на допомогу ЗСУ. Опановуйте нові знання, щоб відбудовувати нову сильну і гарну державу разом. Слава Україні!
Конференція .NET fwdays'21
Автор: Редакція ITVDN
Долгожданная 7-я конференция, посвященная .NET фреймворку — .NET fwdays'21 в формате OFFLINE & ONLINE 🔥
🗓 Дата: 7 августа + дополнительные дни
⏰ Время: 10:00 - 19:00 (UTC + 3)
.NET fwdays'21 — это:
доклады от топовых экспертов Microsoft, SoftServe, Eleks, DevRain и не только, которые поделятся собственным опытом;
дополнительные эфиры с практическими форматами;
Q&A сессии, где вы сможете задать все свои вопросы экспертам;
новые знакомства и много общения;
нетворкинг, розыгрыши от компаний-партнеров и не только
Вы узнаете про бест практики:
как можно использовать концентраторы событий Azure для обработки и хранения этих событий для создания собственного хранилища событий на базе Cosmos DB;
подключения к другим службам Azure и к приложениям Kafka;
как внедрить аутентификацию и авторизацию для мобильных приложений и сервисных служб с помощью платформы Microsoft Identity и не только.
Кому будет интересно?
архитекторам, разработчикам и тестировщикам, которые используют .NET framework в своей работе;
тем, кто хочет лучше разбираться в .NET, NET Core, C #, ASP.NET Core, Azure;
как Junior-ам так и уверенным Senior-ам😉
Есть 3 варианта участия: FREE ONLINE, FULL ONLINE, OFFLINE & ONLINE.
Какой выбрать - решать только вам. На конференции будут выдержаны все карантинные меры. Количество мест "OFFLINE & ONLINE" ограничено.
Регистрируйтесь FREE ONLINE или используйте промокод:
313676B98B - при покупке FULL ONLINE билета
A79B2659CF - при покупке OFFLINE & ONLINE билета
Детали по ссылке ➡️ https://bit.ly/3kFJBSp