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

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

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

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

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

Результати пошуку за запитом: обучение c
Відзнач у календарі WEGAME 4.0 – головна подія граючої України!

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

Геймер, гик, косплеер, разработчик? Любишь веселый движ? Не пропусти: 21–22 апреля в павильоне №1 НК «Экспоцентр Украины» (ВДНХ) для тебя и таких, как ты, состоится крутое событие – фестиваль WEGAME 4.0! Это зрелищно, интересно и просто big fun. Попробуй – жизнь становится лучше, если в ней чаще появляются косплей, игры и классные люди. Регистрация уже открыта Зона киберспорта На фестивале традиционно пройдут киберспортивные соревнования для профессионалов и любителей: турниры по CS:GO и Dota 2, состязания по FIFA 18. Помимо бурлящих эмоций и удовольствия от сражений с достойными соперниками, лучшие игроки получат денежные призы и ценные подарки.  Косплей-шоу Уникальное по своей атмосфере косплей-шоу в этом году разделено на 3 категории: «Фильмы, мультфильмы, сериалы», «Комиксы и художественная литература», «Видеоигры». Определять лучшие выступления будут авторитетные и беспристрастные судьи, хорошо известные косплей-сообществу страны. Трое первых членов жюри уже известны. Марианна Де Морт — косплеер, режиссер, телеведущая и художница. Марианна работала ведущей телепрограммы «Игронавты», выступала в качестве модели на международном фестивале «Дети Ночи: Чорна Рада 2010» и ежегодном вампирском фестивале VAMPIRE DECADENCE. Ее фотографии украшают музыкальные сборники начинающих групп и обложку журнала Gothica. Джулия Мельник – гример, косплеер, художница и участница телевизионных проектов. Джулия увлеклась сложным гримом и создала первый образ для американского конкурса еще в 2014 году, а в 2016-м выиграла грант на обучение в лучшей голливудской школе грима Cinema Makeup School. Получив престижное американское образование, девушка вернулась в Украину и продолжает работать над своими проектами. Мария «Fenix Fatalist» Карпенко – эпатажный косплеер, создатель лаборатории костюмов FD Studio, частный предприниматель. Занимается косплеем уже 10 лет, успев за это время воплотить более тридцати ярких образов. Превратив косплей в работу, Мария рассказывает о своем опыте другим художникам, стремясь создать сильное и открытое комьюнити. Внимание, плюшка: кроме возможности продемонстрировать свой образ и выиграть приз, участникам предоставляется бесплатный вход на фестиваль, а посетители в косплей-костюмах получат скидку 50% на билеты! Открытый лекторий Лекторий – это скука? Привычные спикеры так занудны и начитаны, что дужки очков уже не отсоединить от их голов без хирургического вмешательства... Но WEGAME ломает стереотипы! На протяжении двух дней феста с тобой будут делиться опытом успешные IT-стартапы и популярные косплееры, организаторы кибертурниров, разработчики, создающие софт и развлекательный контент. Они современные, крутые, они такие, как ты, и расскажут именно то, что тебе интересно.  Имена и темы первых участников лектория WEGAME 4.0: Мирослава Валькевич – комьюнити-менеджер в Esports.com. Тема: «Чем полезен киберспорт и почему важно играть в компьютерные игры»; Глеб Алехин – разработчик игр, автор образовательного проекта BUSINESS GAMER. Тема: «Настольные игры в эпоху виртуальной реальности»; Максим Безуглый – CEO в Attracti. Тема: «Сильные и слабые стороны в производстве ААА и инди-игр»; Влад Плотников – композитор, продюсер и основатель компании VP Production. Тема: «Игровая музыка: как это сделано?»; Святослав Холод – геймдизайнер в Zadzen. Тема: «Создание мотивации для игрока»; Александр Шаповалов – арт-директор в IDA GAMES. Тема: «Как уничтожить свою игровую компанию»; Александра Радченко – руководитель отдела исследований компании Playtestix. Тема: «PUBG: жизнь до и после релиза, разбор полетов». Отслеживай обновления программы лектория в разделе «Посетителям» на сайте фестиваля. Церемония награждения Отличный шанс для студий, которые хотят ознакомить аудиторию со своим продуктом и собрать максимально объективный feedback, – церемония награждения фестиваля WEGAME для профессиональных и независимых разработчиков видеоигр. Среди них будут как крупные компании, так и инди-проекты. Экспертная комиссия и посетители фестиваля выберут победителей в 10 номинациях. Выставочная зона Никакого унылого кладбища стендов! Когда на выставке собраны самые инновационные и креативные решения, когда можно поиграть в демоверсии игр и опробовать новейшие гаджеты, о которых никто еще даже не слышал, – это зашкал эмоций! Залогом успеха феста традиционно служит международная ивент-компания Smile-Expo – лидер в проведении самых трендовых мероприятий. WEGAME 4.0 имеет все шансы стать самым ярким событием твоей весны. Зарегистрируйся, чтобы впечатления не прошли мимо!
П'ята ювілейна міжнародна конференція MobileOptimized'2015

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

13-15 июля в Минске в усадьбе Ваньковичей состоится пятая юбилейная международная конференция MobileOptimized’2015 – крупнейшее ежегодное событие в Восточной Европе, посвященное мобильной разработке. Конференция пройдет в будние дни в послеобеденном формате, с 15.00, что позволяет совместить обучение с рабочим процессом или туризмом и отдыхом. В этом году конференция MobileOptimized разбита на следующие тематические дни: Technology Day, Business Day и Gamedev Day, которые включат в себя все, что вы хотели знать о мобильной разработке, актуальных технологиях и тенденциях развития mobile-направления в IT-сфере. Кейноуты и докладчики события – ведущие разработчики, профессионалы и энтузиасты своей сферы деятельности, представители как крупных компаний, так и успешных стартапов, в этом году докладчики выступят от имени CocoaPods, Realm.io, Xebia, Spotify, Game Insight, Microsoft, Twitter, Android Academy, а также гордость Беларуси Wargaming, Viber, Apalon, Fitbit, Sport.com. Мы приглашаем вас посетить Business Day – второй день конференции, который включит в себя несколько тематических блоков с практическими сессиями по следующим направлениям: Поток Marketing&Monetization, в котором докладчики, как освоившие миллионы долларов на рекламу, так и успешно запустившие приложения без бюджетов, расскажут об инструментах мобильного маркетинга, о том, как не попасть в сети рекламных сетей, как привлечь миллионы пользователей через Facebook и все о запуске приложения в AppStore и Google Play. Хэдлайнерами блока Management of mobile teams станут опытные менеджеры мобильной разработки из нашумевшего JunoLab, легендарного Wargaming и популярной компании Apalon: Алексей Минкевич, Алексей Алексеев и Денис Денисюк – построение и перестроение мобильной команды, ее эффективность и мотивация из уст лучших. В Product management блоке своим опытом в области управления продуктом поделятся представители компаний Wargaming, Яндекс и Fitbit: Ярополк Раш, Михаил Томшинский и Андрей Точилин, все об упровлении продуктами. The Startup Fails – специальный поток, в котором ныне успешные стартаперы расскажут о своих ошибках и уроках, которые они из них вынесли. Отрепетированные Success Story – это, конечно, неплохо, но в этот день мы сфокусируемся на том, чтобы заглянуть на бэкстейдж и таки выяснить всю правду о создании, построении и неудачах своего продукта. В рамках Business Keynotes выступят видные представители инвестиционого сообщества, владельцы компаний и представители известных стартапов, представители глобальных корпораций, которые расскажут о построении и развитии бизнеса, среди них Игорь Мацанюк, Крис Ховард, Степан Данилов. Событие пройдет 14 июля с 14:30 до 22:00, включая Business Networking Party для всех участников этого дня. Стоимость участия составит 1 490 000. Купить билет, зарегистрироваться, более подробно программу события и список докладчиков можно узнать на сайте мероприятия mo.dev.by. Специальным мероприятием в рамках Business Day в первой половине дня пройдёт StartupsMOrning  – знакомство с топ-15 молодыми и перспективными белорусскими мобильными стартапами и Startup Expo. Участие в #StartupsMOrning – это уникальная возможность познакомиться с основателями стартапов, представить свой продукт нашим гостям из ближнего и дальнего зарубежья: приглашенным инвесторам, фаундерам успешных стартапов, экспертам, а также журналистам. В роли экспертов мероприятие посетят Дмитрий Клевжиц (экс-директор Национального Агентства Инвестиций и Приватизации), Игорь Мацанюк (основатель фонда imi.vc, инвестор компании Game Insight), Алексендр Бородич (частный инвестор) и другие почетные гости. Для подачи заявки и последующего участия в конкурсе заполните, пожалуйста, форму. Мы заинтересованы в развитии и поддержке ваших начинаний, поэтому делаем все необходимое для получения вами опыта в профессиональных питчах, готовы предоставить фидбек о вашем проекте от экспертов, приглашаем большое количество журналистов для обзора проектов. Для тех участников, кто не пройдет конкурсный отбор в топ-15 для питчинга своего проекта мы предлагаем бесплатно выставляться в формате Expo. Ивент пройдет 14 июля с 12:00 до 14:00. Стоимость участия для стартапов совершенно бесплатно, а для молодежи заинтересованной в этой сфере всего 100.000. Также для стартапов, принявших участие в питчах или экспо действует специальная цена на посещение бизнес дня конференции Startup Ticket – 1 690 000 для 2 представителей стартапа, как дополнительная мотивация показать свой проект в формате pitch или expo. Организаторами MobileOptimized'2015 выступают портал dev.by, команда независимой ивент-площадки SPACE, технологические сообщества Беларуси: CocoaHeads Belarus, GDG Minsk, команда стартап-энтузиастов #BelarusMafia, сообщество разработчиков игр Белариси. Партнерами дней выступили компании-лидеры в разработке программного обеспечения, игр и мобильных приложений: Viber, Apalon, Wargaming. Также конференцию поддержали компании Ciklum, Fitbit, Oxagile, Yandex, Specific Group, ISSoft и другие компании. Полное расписание всех дней мероприятия доступно на mo.dev.by. Дополнительная информация доступна в блоге МО на dev.by, в твиттере по хеш-тегу #MOConf или в Facebook.
Як стати Java розробником у 2021

Автор: Максим Федосов

<p>В вебинаре мы будем говорить о том, как начать&nbsp; свой путь в качестве Java разработчика - от новичка без опыта в программировании до уровня специалиста, востребованного на рынке.</p> <p>В вебинаре будут рассмотрены две стороны:</p> <ul> <li><strong>Что учить</strong> &ndash; автор поделится своим виденьем того, что нужно учить в первую очередь как базу, что нужно осваивать на этапе поиска первой работы, и что нужно доучивать, когда специалист уже работает ( на примере Java Enterprise стэка).</li> <li><strong>Как искать работу</strong> - со стороны построения карьеры речь пойдет о том, какие пути можно выбрать для построения карьеры, о рынке с точки зрения работодателя, курсов, соискателей. Какой проект лучше выбрать, как часто менять работу, как развивать свою карьеру.</li> </ul> <p>Весь вебинар будет разделен на 2 части - до первой работы и во время работы. В результате у начинающих специалистов появится конкретный план действий для того, чтобы начать карьеру, а у работающих специалистов появится понимание того, как расти дальше.</p> <p><strong>План вебинара:</strong></p> <p>1) Знакомство, немного о себе и своем пути в IT сфере.</p> <p><strong>2) Что нужно учить начинающему Java</strong><strong> разработчику</strong></p> <ul> <li>Подготовка к смене или обретению профессии. Настройка рабочего окружения, английский язык, выбор стратегии, университет, курсы, самостоятельное обучение, ментор, книги, практика.</li> <li>От общего к частному. Стандартная схема работы приложений в энтерпрайз.</li> <li>Hello World application. Один из ключевых шагов для изучения новых технологий.</li> <li>Базовый синтаксис. Примитивные переменные, операторы, циклы, условия и все с чем мы работаем примерно с 1950 года.</li> <li>Объектно-ориентированное программирование (ООП). Основные принципы ООП (наследование, полиморфизм, инкапсуляция, абстракция) их проявления в коде, класс Object и его методы, понятия &ldquo;класс&rdquo;, &ldquo;конструктор&rdquo;, &ldquo;метод&rdquo;, &ldquo;объект&rdquo;, сигнатура метода.&nbsp;</li> <li>Объекты, хранящие значение. Класс String. Его методы, неизменяемость, String pool. Другие обертки над примитивами.</li> <li>Множества в Java. Arrays (Массивы) Collections (Коллекции) и Maps (Карты). Иерархия Collection, иерархия Map. Множества, которые используются постоянно и о которых спрашивают на собеседованиях и те, о существовании которых просто достаточно знать . Отличия ArrayList от LinkedList. HashMap от HashSet. Array от ArrayList. Алгоритмы, Дженерики, деревья.</li> <li>Обработка исключений. Иерархия исключений, проверяемые и непроверяемые исключения. Error и Exception.</li> <li>Продвинутые темы, знакомство. Функциональное программирование, лямбда выражения, функциональные интерфейсы, стримы, IO (Input Output(ввод и вывод данных)), Serialization, Multithreading, Concurrency.</li> <li>Базы данных. Реляционные и NoSQL базы данных, язык запросов SQL, Joinы и их типы, Postgres и другие базы данных, связи между таблицами.</li> <li>Repository уровень. Взаимодействие Объектно-ориентированной модели с реляционной. JDBC, JPA + Hiberante, JPQL/HQL, Spring Data.</li> <li>Spring framework. Inversion of Control и Dependency injection. Reflection. Аннотации: Bean, Controller, Service, Component, Repository, Configuration и другие. Spring Security.</li> </ul> <p><strong>3) Наработка практики программирования. Портфолио</strong></p> <ul> <li>Pet project с примером. Spring, JPA + HIbernate, Controller + Thymeleaf/RestController, Postgres. MVC архитектура.</li> <li>Портфолио. Spring Boot, Spring Data, Jira, Git branches и команда, code review, обсуждения архитектуры, отдельная идея.</li> </ul> <p><strong>4) Подготовка к поиску работы и дальнейшая карьера</strong></p> <ul> <li>CV, LinkedIn аккаунт, djinny.</li> <li>Подготовка к интервью с HR. Английский, вопросы, ответы, тестовые задания, софт скиллы.</li> <li>Подготовка к техническому интервью. Mock собеседования, материалы. SOLID, KISS, DRY и прочие важные для собеседования вопросы.</li> <li>Поиск работы и прохождение собеседований. Активность в LinkedIn, Djinny, Dou и через знакомых в компаниях.</li> <li>Первые 3 месяца на проекте. Чего обычно ждут от Trainee или Junior. Как продолжать расти.</li> <li>Первый год. Книги, которые нужно прочитать, продвинутые темы, в которые нужно вникнуть, GOF паттерны, сертификации.</li> <li>Второй год. Микро-сервисы, Облачные технологии, другие технологии.</li> </ul> <p><strong>Целевая аудитория:</strong></p> <p>Данный вебинар будет интересен людям, думающим о том, чтобы стать Java разработчиком, начинающим специалистам, которые уже сделали свой выбор и двигаются к поиску первой работы, а также trainee и junior разработчикам, которые уже работают на своих первых проектах и думают о том, куда двигаться дальше.</p>
Пишемо гру "Dendy Tanks" на Java з нуля.

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

<p>Мы подготовили для вас увлекательный онлайн тренинг по написанию графической игры &ldquo;Танки&rdquo;, который поможет легко и быстро познакомиться с практической стороной разработки на Java. Ноль теории, только практика. Если ты никогда не программировал &ndash; не проблема! Смотри и делай!<br bis_size="{&quot;x&quot;:813,&quot;y&quot;:42,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:1227,&quot;abs_y&quot;:756}"> &nbsp;<br bis_size="{&quot;x&quot;:23,&quot;y&quot;:62,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:437,&quot;abs_y&quot;:776}"> <strong bis_size="{&quot;x&quot;:20,&quot;y&quot;:82,&quot;w&quot;:158,&quot;h&quot;:15,&quot;abs_x&quot;:434,&quot;abs_y&quot;:796}">Кому это будет полезно:</strong><br bis_size="{&quot;x&quot;:178,&quot;y&quot;:82,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:592,&quot;abs_y&quot;:796}"> &nbsp;</p> <ul bis_size="{&quot;x&quot;:20,&quot;y&quot;:133,&quot;w&quot;:1019,&quot;h&quot;:60,&quot;abs_x&quot;:434,&quot;abs_y&quot;:847}"> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:133,&quot;w&quot;:939,&quot;h&quot;:40,&quot;abs_x&quot;:474,&quot;abs_y&quot;:847}" style="text-align: justify;"><strong bis_size="{&quot;x&quot;:60,&quot;y&quot;:135,&quot;w&quot;:64,&quot;h&quot;:15,&quot;abs_x&quot;:474,&quot;abs_y&quot;:849}">Новичкам</strong>. Отсутствие опыта в программировании не должно вас останавливать. Мы предоставляем вам шанс сделать свою первую программу на Java и получить опыт практического применения данного языка программирования в создании настоящей компьютерной игры.</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:173,&quot;w&quot;:939,&quot;h&quot;:20,&quot;abs_x&quot;:474,&quot;abs_y&quot;:887}" style="text-align: justify;"><strong bis_size="{&quot;x&quot;:60,&quot;y&quot;:175,&quot;w&quot;:290,&quot;h&quot;:15,&quot;abs_x&quot;:474,&quot;abs_y&quot;:889}">Начинающим Java разработчикам без опыта</strong>. Вы сможете углубить и применить на практике свои знания языка Java под руководством тренера.</li> </ul> <p>&nbsp;<br bis_size="{&quot;x&quot;:23,&quot;y&quot;:208,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:437,&quot;abs_y&quot;:922}"> <strong bis_size="{&quot;x&quot;:20,&quot;y&quot;:228,&quot;w&quot;:130,&quot;h&quot;:15,&quot;abs_x&quot;:434,&quot;abs_y&quot;:942}">Чему вы научитесь:</strong></p> <ul bis_size="{&quot;x&quot;:20,&quot;y&quot;:259,&quot;w&quot;:1019,&quot;h&quot;:80,&quot;abs_x&quot;:434,&quot;abs_y&quot;:973}"> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:259,&quot;w&quot;:939,&quot;h&quot;:20,&quot;abs_x&quot;:474,&quot;abs_y&quot;:973}">Писать простые программы и подпрограммы с использованием языка Java</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:279,&quot;w&quot;:939,&quot;h&quot;:20,&quot;abs_x&quot;:474,&quot;abs_y&quot;:993}">Работать с массивами данных</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:299,&quot;w&quot;:939,&quot;h&quot;:20,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1013}">Использовать типы данных и классы Java</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:319,&quot;w&quot;:939,&quot;h&quot;:20,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1033}" style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 12pt;">Применять все базовые навыки (переменные, условные конструкции, циклы, методы) на практике</li> </ul> <p><strong bis_size="{&quot;x&quot;:20,&quot;y&quot;:357,&quot;w&quot;:111,&quot;h&quot;:15,&quot;abs_x&quot;:434,&quot;abs_y&quot;:1071}">Формат тренинга</strong><br bis_size="{&quot;x&quot;:131,&quot;y&quot;:357,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:545,&quot;abs_y&quot;:1071}"> Вас ждёт прямой эфир на YouTube с Андреем Бондаренко в течение 3-х часов, общение в чате во время эфира и в специальном телеграм-канале вне эфира. Все примеры и исходные данные также будут в телеграм-канале, к которому вы сможете присоединиться после регистрации.<br bis_size="{&quot;x&quot;:758,&quot;y&quot;:397,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:1172,&quot;abs_y&quot;:1111}"> &nbsp;<br bis_size="{&quot;x&quot;:23,&quot;y&quot;:417,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:437,&quot;abs_y&quot;:1131}"> <strong bis_size="{&quot;x&quot;:20,&quot;y&quot;:437,&quot;w&quot;:137,&quot;h&quot;:15,&quot;abs_x&quot;:434,&quot;abs_y&quot;:1151}">Программа тренинга:</strong></p> <ol bis_size="{&quot;x&quot;:20,&quot;y&quot;:468,&quot;w&quot;:1019,&quot;h&quot;:133,&quot;abs_x&quot;:434,&quot;abs_y&quot;:1182}"> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:468,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1182}" style="text-align: justify; line-height: 19.5px;">Создание карты поля боя</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:487,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1201}" style="text-align: justify; line-height: 19.5px;">Работа над передвижением танка</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:506,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1220}" style="text-align: justify; line-height: 19.5px;">Реализация стрельбы</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:525,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1239}" style="text-align: justify; line-height: 19.5px;">Обучение танка двигаться в указанный квадрант</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:544,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1258}" style="text-align: justify; line-height: 19.5px;">Добавление танка-противника</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:563,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1277}" style="text-align: justify; line-height: 19.5px;">Итог: танк проходит всё поле боя и чистит его</li> <li bis_size="{&quot;x&quot;:60,&quot;y&quot;:582,&quot;w&quot;:939,&quot;h&quot;:19,&quot;abs_x&quot;:474,&quot;abs_y&quot;:1296}" style="margin-bottom: 12pt; text-align: justify; line-height: 19.5px;">Ответы на вопросы. Куда развиваться дальше?</li> </ol> <p><strong bis_size="{&quot;x&quot;:20,&quot;y&quot;:619,&quot;w&quot;:55,&quot;h&quot;:15,&quot;abs_x&quot;:434,&quot;abs_y&quot;:1333}">Подарки</strong><br bis_size="{&quot;x&quot;:75,&quot;y&quot;:619,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:489,&quot;abs_y&quot;:1333}"> 10 самых активных участников тренинга получат от CyberBionic Systematics Подарочные сертификаты на обучение стоимостью 1000 грн.<br bis_size="{&quot;x&quot;:855,&quot;y&quot;:639,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:1269,&quot;abs_y&quot;:1353}"> &nbsp;<br bis_size="{&quot;x&quot;:23,&quot;y&quot;:659,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:437,&quot;abs_y&quot;:1373}"> <strong bis_size="{&quot;x&quot;:20,&quot;y&quot;:679,&quot;w&quot;:164,&quot;h&quot;:15,&quot;abs_x&quot;:434,&quot;abs_y&quot;:1393}">Учись вместе с друзьями</strong><br bis_size="{&quot;x&quot;:184,&quot;y&quot;:679,&quot;w&quot;:0,&quot;h&quot;:15,&quot;abs_x&quot;:598,&quot;abs_y&quot;:1393}"> Регистрируйся на онлайн интенсив и поделись новостью с друзьями. Вместе учиться намного интереснее!</p>
Введення в розробку програм під iOS. Частина 2.

Автор: Volodymyr Bozhek

                                                       Здравствуйте дорогие читатели. В этом уроке мы добавим форму списка товаров на складе. Разберем класс “UITableViewController” и как с ним работать. Откройте проект Warehouse из предыдущего урока. Необходимо добавить в наш проект две View. На одной будут содержаться все товары, которые есть на складе. На второй форма редактирования товара. Для реализации View со списком всех товаров мы будем использовать готовый табличный класс контроллера “UITableViewController”. Данный класс уже реализовал все необходимые протоколы внутри себя для уверенной работы табличного контроллера. Есть и другой вариант, который мы не будем рассматривать в этом уроке, это сделать свой класс “UITableViewController”, унаследовшись от базового класса “UIViewController” и реализовав протоколы “UITableViewDelegate” и “UITableViewDatasource”. В панели навигатора откройте модуль “Main.storyboard”. Найдите в библиотеке компонентов, компонент “Table View Controller” и перетяните в пустую область дизайнера рядом с View входа в систему. В панели навигатора, нажмите правой кнопкой мыши на папке “Warehouse” и в контекстном меню выберите пункт “New File...”. Откроется диалоговое окно добавления новых модулей в проект. Найдите в нем модуль “Swift File”, выделите его и нажмите кнопку “Next”. Появится диалоговое окно задания названия добавляемого модуля. В поле “Save As” введите “SuppliesViewController.swift”, нажмите кнопку “Create”.                                                                                                           Откройте модуль “SuppliesViewController.swift”, вы увидите в нем только “import Foundation”, это добавление пространства имен на базовую библиотеку классов Swift (аналог в C#, пространство имен “System”). Удалите эту строку. Добавьте в этот модуль следующий код: Разберем это код построчно. На 9 строке, мы подключили пространство имен “UIKit” в нем содержатся классы для взаимодействия с компонентами пользовательского интерфейса в iOS. На 11 строке, мы объявили класс с именем “SuppliesViewController”, который наследуется от класса “UITableViewController”. На 12 строке, мы объявили строковый массив с именем “supplies”, в этом массиве содержится статический список товаров (чуть позже мы заменим его на модель). На 17 строке, мы переопределили метод “viewDidLoad” класса “UITableViewController”, данный метод вызывается когда View начинает загрузку. В этом методе необходимо делать предварительную инициализацию компонентов, какими либо данными. На 18 строке, мы вызываем базовый метод “viewDidLoad” класса “UITableViewController”, с помощью ключего слова “super” (аналог в C#, ключевое слово “base”). Начиная с 21 строки и по 33 строку, мы переопределяем поведение базового контроллера “UITableViewController”, для отображения данных в нем. Более конкретно, мы переопределяем реализацию протокола “UITableViewDataSource”. На 21 строке переопределенный метод “numberOfSections”, возвращает количество секций в нашем табличном представлении. Секции это разделители между сгруппированными наборами ячеек в табличном представлении. У нас будет одна секция. На 25 строке переопределенный метод “numberOfRowsInSection”, возвращает количество ячеек в секции. Секция у нас одна, поэтому возвращаем количество товаров, которые будут в этой секции. На 29 строке переопределенный метод “cellForRowAt indexPath”, возвращает представление ячейки таблицы. На 30 строке мы создаем экземпляр типа “UITableViewCell” с повторно используемым идентификатором “сell”, первый параметр в инициализаторе это стиль ячейки, второй параметр это идентификатор этой ячейки в табличном представлении. Данный метод вызывается столько раз, сколько ячеек мы добавляем в нашу таблицу. Каждый вызов данного метода содержит в аргументе “indexPath” текущую позицию ячейки относительно таблицы. На 31 строке мы обращаемся к компоненту “Label”, расположенному внутри ячейки, чтобы задать текст, для этого используем свойство “textLabel”, затем от этого свойства уже обращаемся к свойству “text”, чтобы задать текст компонента “Label”. Текст мы извлекаем из массива товаров “supplies” через subscript (по индексу). Чтобы получить текущий номер строки, необходимо обратиться к аргументу “indexPath” и обратиться к свойству “row”. На 32 строке мы возвращаем созданную ячейку. Эта ячейка затем внутренними механизмами будет добавлена в табличное представление. Откройте модуль “Main.storyboard”, выделите добавленный ранее “Table View Controller”. В панели свойств, откройте вкладку “Show the identity inspector”, найдите поле “Class”, введите значение “SuppliesViewController”. Через это свойство мы подвязываем класс контроллера “SuppliesViewController” к нашему табличному представлению в дизайнере. Найдите свойство “Storyboard ID”, задайте значение в нем “SuppliesViewController”. Данное свойство содержит уникальный идентификатор представления, этот идентификатор будет позднее использоваться нами при поиске табличного представления программно в экземпляре “Storyboard”. Теперь нам необходимо добавить в обработчик события на нажатие кнопки “Вход”, переход на табличное представление. Откройте модуль “ViewController”. Добавьте код в метод “loginButtonTapped”, как показано ниже (смотреть выделенный код): Разберем добавленный код: На 23 строке, правым операндом мы обращаемся к свойству “storyboard” контроллера “ViewController”, в этом свойстве содержится экземпляр модуля “Main.storyboard”. Вызов метода “instantiateViewController” производит поиск представления по идентификатору “Storyboard ID”, которое мы задавали ранее, в модуле “Main.Storyboard” и возвращает базовый класс контроллера “UIViewController”. Класс “UITableViewController” наследуется от класса “UIViewController”, соответственно допустимо приведение данного экземпляра к классу “UITableViewController”. Класс “SuppliesViewController“ наследуется от класса “UITableViewController”. Соответственно мы приводим полученный экземпляр в правом операнде к типу “SuppliesViewController” и присваиваем его левому операнду c именем “controller”. Левый операнд объявлен константой, поскольку он не будет в дальнейшем проходить переинициализацию. На 24 строке, мы обращаемся к свойству “navigationController”, в данном свойстве содержится экземпляр класса “UINavigationController” (сейчас он не инициализирован и содержит значение “nil”). Затем от экземпляра этого свойства мы вызываем метод “pushViewController”. Данный метод принимает два аргумента, экземпляр контроллера, который надо отобразить и флаг использовать анимацию при отображении контроллера или нет. Если вы сейчас запустите приложение, заполните поля “Имя пользователя” и “Пароль пользователя” и нажмете кнопку “Вход”, вы получите ошибку, так как текущее представление не содержит экземпляра “UINavigationController”. Давайте это исправим. Откройте модуль “Main.storyboard”. Выделите в дизайнере представление “ViewController”, затем в меню Xcode выберите “Editor -> Embed In -> Navigation Controller”. После этого действия в дизайнер Storyboard добавится представление “Navigation Controller” привязанное к представлению “ViewController”. Данное представление инициализирует свойство “navigationController” класса “ViewController”, данное свойство имеет тип доступа только для чтения и не подлежит переинициализации в коде контроллера. Модуль “Main.storyboard” должен выглядеть так: Теперь запустите приложение. Заполните поля “Имя пользователя” и “Пароль пользователя”, нажмите кнопку “Вход”. Откроется табличное представление:   Но в нем нас смущает “Top Bar”, который отображается сверху. Его не должно быть видно на странице входа в систему. Чтобы его убрать, откройте модуль “Main.storyboard”, выделите представление “ViewController”, в панели свойств перейдите на вкладку “Show the attributes inspector”. На этой вкладке найдите свойство “Top Bar” и установите для него значение “None”, в дизайнере “Top Bar” пропал, но вот если вы запустите приложение снова, то он остался на прежнем месте. Чтобы его скрыть, перейдите в модуль “ViewController.swift”. После переопределенного метода “viewDidLoad” вам необходимо переопределить еще два метода класса “UIViewController” это методы “viewWillAppear” и “viewWillDisappear”. Исправьте код в соответствии с кодом ниже: Разберем построчно внесенные изменения. На 33 строке мы переопределили метод “viewWillAppear”. Данный метод вызывается когда наше представление уже появилось на экране. На 34 строке мы вызываем метод “viewWillAppear” из базового класса “UIViewController”, чтобы сохранить его поведение. На 35 строке мы обращаемся к свойству “navigationController” и вызываем от экземпляра этого свойства метод “setNavigationBarHidden”. Данный метод скрывает или отображает “Top Bar” и принимает два аргумента, первый аргумент указывает скрыть или отобразить “Top Bar”, второй указывает, сделать это с анимацией или без. В этом методе мы скрываем “Top Bar”. На 38 строке мы переопределяем метод “viewWillDisappear”. Данный метод вызывается когда наше представление перекрывается другим представлением поверх него. На 39 строке мы вызываем метод “viewWillDisappear” из базового класса “UIViewController”, чтобы сохранить его поведение. На 40 строке мы обращаемся к свойству “navigationController” и вызываем от экземпляра этого свойства метод “setNavigationBarHidden”. В этом методе мы отображаем “Top Bar”. Запустите приложение. Теперь все отображается правильно. С одной стороны да, с другой нет. После того как мы выполнили переход на табличное представление, в нем в левом верхнем углу отображается кнопка навигации “< Back”, но ведь наше приложение на русском. Давайте изменим текст этой кнопки на “<- Назад”. Откройте модуль “SuppliesViewController.swift”. После метода “cellForRowAt indexPath”, добавьте следующий код: Разберем этот код построчно. На 36 строке мы объявили метод с именем “initNavigationButtons”, который ничего не возвращает и ничего не принимает. На 37 строке мы вызываем обращаемся в левом операнде к свойству “navigationItem” в котором содержится экземпляр класса “UINavigationItem”. Данное свойство предоставляет доступ к системным кнопкам навигации. От экземпляра свойства “navigationItem” мы обращаемся к свойству “leftBarButtonItem” в котором содержится экземпляр класса “UIBarButtonItem” инициализированный по умолчанию текстом “< Back”. В правом операнде мы создаем новый экземпляр класса “UIBarButtonItem” и вызываем его инициализатор, который принимает 4 аргумента. Первый аргумент “title” задает текст кнопки навигации. Чтобы в текст вставить специальный символ Unicode, необходимо в меню среды разработки Xcode выбрать “Edit -> Emoji & Symbols”, затем выбрать подходящий символ и нажать на него. Второй аргумент “style” принимает перечисление типа “UIBarButtonItemStyle”, в этом аргументе мы задаем значение по умолчанию. Третий аргумент “target” имеет тип “AnyObject?”, в него мы передаем экземпляр нашего контроллера. Четвертый аргумент “action” имеет тип “Selector?”, в него мы передаем метод обработчик нажатия на кнопку навигации. Обратите внимание на запись “#selector(SuppliesViewController.backToParent)”, в этой записи с помощью выражения “#selector” создается экземпляр типа “Selector”. В скобках мы указываем путь к методу обработчику события в формате “Класс контроллера . метод”. На 40 строке мы объявляем метод обработчик события нажатия по кнопке навигации с именем “backToParent”, который не принимает аргументов и ничего не возвращает. На 41 строке мы обращаемся в правом операнде к свойству “navigationController” и вызывает от экземпляра этого свойства метод “popViewController”. Данный метод скрывает текущее представление и переход на предыдущее представление в иерархии вызова представлений. Принимает один аргумент, который задает стиль открытия предыдущего представления с анимацией или без. Добавьте в метод “viewDidLoad”, вызов метода “initNavigationButtons” (19 строка). Запустите приложение. Вы увидите такой результат: На этом урок подошел к концу. На следующем уроке, мы создадим модель товара. Добавим кнопку добавления нового товара, добавим форму редактирования товара и зададим поведение в табличном представлении на редактирование/удаление товара. После того, как редактирование товаров будет завершено, можно будет приступать к уроку в котором будут разбираться иконка приложения и папка Assets.
Введення в розробку програм під iOS. Частина 1.

Автор: Volodymyr Bozhek

Здравствуйте, дорогие читатели. Данный блок будет продолжением темы “Введение в  разработку под iOS", которую мы затронули ранее. В этом уроке мы: рассмотрим пользовательский интерфейс среды разработки; сделаем форму авторизации для нашего приложения Warehouse; научимся добавлять обработчиков событий на элементы управления. Работу продолжим на примере приложения Warehouse, который мы создавали в первом уроке. В среде разработки Xcode можем видеть две панели. Левая из них - это панель навигации по составляющим проекта: Правая делится на панель свойств и панель библиотеки компонентов. Панель свойств: Библиотека компонентов: Также вы можете использовать набор функций в панели инструментов, который находится сверху: Обратите внимание на кнопки этой панели справа: Нажимая на них, вы будете скрывать или отображать левую, правую, нижнюю панель в среде разработки. Левее находится блок функциональных кнопок для отображения данных выбранного модуля: Кнопка отображения текущего представления модуля. Кнопка отображения связанного модуля с текущим модулем. Применяется для того, чтобы видеть на одной половине экрана код контроллера, а на другой - дизайнер представления.  Кнопка отображения изменений с момента последней заливки данных в репозиторий. Используется, если ваш проект находится под управлением GIT Панель снизу - это панель отладки и логирования: В панели навигации откройте модуль “Main.storyboard”. Обратите внимание на стрелку слева, которая указывает на View. Эту стрелку можно перемещать, зажав ее левой кнопкой мыши. Отмечу, что при включении в настройках вашей OS X эмуляции двухкнопочной мыши важно понимать, что на тачпаде нет понятия нажатия левой или правой кнопки мыши, есть просто нажатие. Данная стрелка означает точку входа в наше приложение. Точка входа привязывается только к одной View, и эта View будет отображаться первой при старте нашего приложения. Исключением может быть только модуль конфигурации предварительной заставки “LaunchScreen.storyboard”, тогда сначала будет появляться заставка с презентацией функций приложения, а затем наша View, на которую была привязана точка входа. Нажмите на View, на панели свойств откройте вкладку “Show the identity inspector”. В поле “Class” содержится класс контроллера, который привязан к нашему представлению (View). Рядом с названием класса “ViewController” есть серая иконка со стрелкой вправо, если вы нажмете на нее, то попадете в модуль контроллера “ViewController”. Вернитесь в модуль “Main.storyboard”. В свойствах дизайнера внизу выберите устройство “iPhone 6s”: Перенесите из библиотеки компонентов два элемента управления “Text Field” и один элемент управления “Button” на View. Выделите элемент управления “Text Field” справа и слева от него будут видны квадратики, потяните за правый квадратик и растяните поле на всю ширину экрана. То же самое проделайте со вторым элементом управления “Text Field” и элементом управления “Button”. У вас должно получится так, как на картинке ниже: Обратите внимание на кнопки внизу дизайнера: Это кнопки для отображения панелей свойств элементов управления. На этих панелях задаются выравнивания элементов управления либо относительно View, на котором они расположены, либо относительно других элементов управления, находящихся с ними по соседству. В терминологии Apple они называются ограничениями (Constraints). Это отдельная и довольно объемная тема для понимания, поэтому пока мы будем пользоваться только одной панелью задания ограничений, более простой для понимания. Выделите первый элемент управления “Text Field”, затем нажмите на кнопку “Pin” в дизайнере: Появится диалог ограничений для данного элемента управления: Выпадающие списки сверху, снизу, слева и справа - это допустимое расстояние элемента управления относительно стен View соответственно. Нам необходимо задать ограничение, чтобы наш элемент управления остался на том же месте, где он сейчас расположен на View , но при этом, в зависимости от ширины экрана устройства, подстраивался под эту ширину. Чтобы этого добиться, снимите галочку с “Constrain to margin”, отметьте галочкой поле “Height”, чтобы высота элемента управления не менялась. Отметьте линии верхняя, левая и правая. У вас должно получиться вот так: Заметьте, кнопка “Add 4 Constraints” стала активной. Нажмите на нее. Теперь проделайте ту же самую операцию для второго элемента управления “Text Field” и элемента управления “Button”. Значения в выпадающих списках не меняйте. Можно запустить приложение и посмотреть, что получилось. Остановите приложение. Откройте модуль “Main.storyboard”. Теперь нам необходимо привести в порядок пользовательский интерфейс и сделать его понятным для пользователя. Выделите первый элемент управления “Text Field”. В панели свойств откройте вкладку “Show the attributes inspector”, на этой вкладке найдите поле “Placeholder”, введите в это поле текст “Введите имя пользователя”. Свойство Placeholder задает текст, который отображается в поле ввода, когда это поле не заполнено. Выделите второй элемент управления “Text Field”, в панели свойств, откройте вкладку “Show the attributes inspector”, на этой вкладке найдите поле “Placeholder”, введите в это поле текст “Введите пароль пользователя”. Затем найдите поле “Secure Text Entry” и отметьте его галочкой. Данное свойство будет отображать звездочки вместо текста, вводимого пользователем, используется для полей ввода паролей. Выделите кнопку “Button”, в панели свойств, откройте вкладку “Show the attributes inspector”, найдите поле без названия с текстом “Button”, удалите этот текст и добавьте текст “Вход”. Найдите поле “Text Color”, установите цвет текста “White Color”. Найдите поле “Background”, установите фон кнопки цветом “Blue Color”. Перетащите из библиотеки компонентов на View под кнопку “Вход” элемент управления “Label”. Растяните его по ширине экрана. Задайте ему такие же ограничения, как мы задавали выше для прошлых элементов управления. Выделите элемент управления “Label”, в панели свойств, откройте вкладку “Show the attributes inspector”. На этой вкладке найдите поле без названия с текстом “Label”. Удалите из него текст, введите текст “Нет ошибок”. Найдите поле “Alignment”, задайте выравнивание текста по центру. Выделите View, в панели свойств, откройте вкладку “Show the attributes inspector”, найдите поле “Background”, установите фон View “Light Green”. У вас должно получиться следующее: Теперь необходимо добавить действие на нажатие кнопки “Вход” и объявить переменные для полей ввода и элемента управления “Label”. Для этого в панели инструментов нажмите кнопку “Show the assistant editor”, экран разделится пополам. Если экран вашего компьютера не позволяет нормально видеть дизайнер и модуль контроллера, скройте панель навигатора и панель свойств. Выделите первый элемент управления “Text Field” в дизайнере, не отводя курсор мыши с этого элемента управления, зажмите кнопку “Ctrl”, нажмите и удерживайте левую кнопку мыши, затем начинайте вести курсор на окно с модулем контроллера, когда курсор окажется между фигурными скобками класса контроллера, отпустите левую кнопку мыши, появится диалоговое окно параметров элемента управления: В данном окне есть несколько полей. Давайте их рассмотрим подробнее. Поле “Connection”,  может принимать несколько вариантов значений, в данном уроке нас будут интересовать всего два значения “Outlet” (используется для создания переменной, связанной с элементом управления) и “Action” (используйте для задания обработчика события на какое либо действие элемента управления). Поле “Name”, сюда вы вводите название вашей переменной, которая будет связана с элементом управления. Поле “Type”, содержит тип элемента управления (название класса элемента управления), можно ввести другой класс, если вы знаете иерархию наследования элемента управления UITextField. Поле “Storage”, содержит вид размещения созданной переменной в памяти операционной системы. Может принимать значения “Weak” или “Strong”. В поле “Name” введите название переменной “userNameTxt” и нажмите кнопку “Connect” или кнопку “Enter” на клавиатуре. В модуле контроллера добавится строчка с названием переменной, которую вы задали. Обратите внимание на черный шарик, находящийся на одном уровне с этой переменной слева в области нумерации строк. Нажмите на него, и в дизайнере выделится элемент управления, к которому привязана данная переменная. Вот пример: Повторите данное действие для остальных элементов управления. Для второго текстового поля  укажите название переменной “passwordTxt”. Для элемента управления “Label” укажите название переменной “validationLabel”. Для кнопки выберите в поле “Connection” значение “Action”, у вас добавится еще одно поле “Event”. В данном поле задается событие, на которые вы хотите назначить обработчик в коде контроллера. По умолчанию установлено событие “Touch Up Inside”, оставьте его как есть. В поле “Type” установлено значение “AnyObject” (Это класс, который может содержать любые типы данных, аналог подобного класса в других языка программирования, например, C# - это класс Object). Измените это значение на тип элемента управления UIButton, поскольку данный объект будет передан в аргументы метода обработчика назначенного события и намного удобнее будет обращаться явно к экземпляру кнопки, чем распаковывать этот экземпляр путем приведения к типу “UIButton” из типа “AnyObject”. В поле “Name” введите “loginButtonTapped”. У вас должно получиться вот так: Нажмите кнопку “Connect”. Код контроллера должен выглядеть вот так: Теперь давайте проверим, работает ли событие нажатия по кнопке “Вход”. Добавьте в метод “loginButtonTapped” следующий код: Давайте разберем этот код. На 16 строке идет проверка наличия текста в поле ввода “Имя пользователя”. Ключевое слово “self” означает ссылка на самого себя, в других языках программирования аналог, например, в C# - это ключевое слово “this”. Из переменной “userNameTxt” мы обращаемся к свойству “text”, данное свойство возвращает текст, который вы ввели в данный элемент управления. Знак вопроса в конце  этого свойства ставится, так как это свойство имеет тип String? и может содержать значение “nil” (аналог “null” в C#). Далее мы обращаемся к свойству “characters” , которое содержит массив символов и от этого массива вызываем свойство “count”, чтобы получить количество символов в строке. Такая запись введена, начиная со Swift 3, доступного с обновлением среды разработки до Xcode 8 версии. В ранних версиях Swift, например, версии 2.1-2.3 можно было получить длину строки намного короче “self.userNameTxt.text?.length”. Если поле ввода “Имя пользователя” не заполнено, мы отображаем сообщение валидации “Имя пользователя не задано”. На 18 строке мы делаем аналогичную проверку для поля “Пароль пользователя”. На 20 строке мы проверяем, если заполнены оба поля ввода, тогда все хорошо и мы выводим сообщение “Нет ошибок”. Обратите внимание на запись “(self.userNameTxt.text?.characters.count)!”, скобки и знак восклицания в конце, на самом деле, применяются к свойству “text”, так как оно имеется Nullable тип. Этой записью мы гарантируем компилятору, что в данном свойстве не будет содержаться значение “nil” и данное свойство будет инициализировано. Теперь запустите приложение и проверьте его работу. На этом урок подошел к концу. В следующем уроке мы рассмотрим работу с классами UITableViewController, навигацию между представлениями, понятие делегата, разберем формат и размеры иконки приложения, научимся использовать Assets.
150+ питань з .NET для Junior, Middle та Senior

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

Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 10 ноября 2020 года. Оригинальная версия на украинском языке доступна по ссылке. На DOU размещено более 450 вакансий для .NET-разработчиков, что свидетельствует о популярности этой технологии. Редакция DOU собрала вопросы, которые .NET-разработчики задают своим коллегам на технических собеседованиях. Готовьтесь на здоровье :) Вопросы для Junior Общее 1. Назовите основные принципы ООП. 2. Что такое наследование, инкапсуляция, абстракция, полиморфизм: приведите примеры (желательно из собственного опыта). От какого класса неявно наследуются все классы в .NET? Разрешено ли множественное наследование в C#? 3. Что такое рекурсия? 4. Что такое лямбда-выражение? 5. Что такое параллельное программирование (многопоточность) и его назначение? Какие классы используются? 6. Что такое JSON? 7. Как вы понимаете REST? 8. Расскажите о SPA concept. 9. Какие GoF-паттерны использовали? 10. Какая разница между GET и POST HTTP методами? 11. Какую проблему решает Docker? Каковы его плюсы и минусы? 12. Чем принципиально отличаются unit-тесты от интеграционных тестов?   Обработка исключений 13. Что такое Exception? 14. Для чего служат try, catch, finally? В каком случае может не выполниться блок finally? 15. Что такое call stack? Какие ключевые слова вы знаете?   Платформа .NET 16. Что такое ASP.NET? 17. Какие существуют типы Action filters? 18. Что такое Web Service? 19. Что такое CLR? 20. Что такое сборщик мусора (Garbage Collector) на базовом уровне? 21. Что такое делегат? 22. Отличается ли Delegate от Action? 23. Что такое LINQ и для чего используется? Приведите несколько примеров применения LINQ. 24. Что такое пространство имен (namespace) и зачем это нужно?   Типы данных, коллекции и структуры данных 25. Какие типы данных вы знаете? 26. Какие примитивные типы знаете? 27. Что такое Nullable-тип? 28. Что такое тип значения, а что такое тип ссылки? Что из этого class, а что struct? В каком участке памяти они хранятся? 29. Чем отличаются value от reference type? String - это reference или value? 30.В чем отличие между string builder и string? 31. Что такое дженерики? Какие проблемы они решают? 32. Что такое boxing / unboxing? 33. Что такое Array, List, HashSet, Dictionary? Приведите примеры использования этих структур данных. Какая сложность операций с ними (поиск, вставка, удаление)? 34. Какие знаете коллекции? 35. Что делает оператор yield?   Классы, структуры и интерфейсы 36. Что такое класс? 37. Чем отличается класс от абстрактного класса? 38. Чем отличается абстрактный класс от интерфейса? Для чего нужны интерфейсы и какие задачи они выполняют? 39. Какие вы знаете модификаторы доступа? 40. В чем разница между обычным классом и статическим? 41. В чем разница переопределения метода между ключевыми словами new и override? 42. Какое различие между const и read only? 43. Разница между структурой и классом. Приведите примеры структур. 44. Может ли экземпляр структуры храниться в куче (heap)? Как это сделать?   Асинхронность 45. Что такое асинхронность и чем она отличается от многопоточности? 46. Какие есть ключевые слова для использования асинхронности в коде? 47. Что означают ключевые слова async / await?   Базы данных 48. Разница между реляционными и нереляционными базами, плюсы и минусы использования обоих вариантов. 49. Что такое индексы в RDBMS? 50. Какие типы JOIN существуют в SQL?   Тестирование 51. Для чего нужны unit-тесты? 52. Какие преимущества и недостатки использования unit-тестов? 53. Из каких трех логических блоков состоит unit-тест?   Вопросы для Middle   Общее 54. Вы набираете google.com в браузере. Расскажите как можно подробнее, что происходит в это время на HTTP-уровне? 55. Как работает HTTPS? 56. Как вы понимаете SOLID? 57. Какие протоколы сериализации вы знаете и где они применяются? 58. Что такое в вашем понимании чистая функция? Какие у нее преимущества? 59. Что такое dependency injection и зачем оно нужно? 60. Что такое cohesion и coupling (связанность и связность)? 61. Что такое IaaS, PaaS, SaaS и каковы различия между ними? 62. Какие способы отладки программы вы используете? 63. Какие знаете паттерны? Объясните суть перечисленных. 64. В чем суть паттерна Singleton? Почему его еще называют антипаттерном? 65. Для чего нужен паттерн Strategy? 66. Какие ключевые различия между распределенными системами и монолитными? 67. Какие паттерны проектирования распределенных систем вы знаете? 68. Какие есть принципы работы Message bus? Почему могут возникать дубликаты в очередях? 69. Какие принципы построения идемпотентных сервисов знаете? 70. Расскажите, как работают асинхронные методы? Чем асинхронность отличается от параллелизма?   Платформа .NET 71. Какие исключения нельзя остановить в блоке catch? 72. Какая разница между .NET Standard Class Library и .NET Core Class Library? 73. Объясните разницу между отложенным и немедленным исполнением в LINQ. Приведите примеры. 74. Для чего нужен метод ConfigureServices в Startup.cs? 75. Какая разница между services.AddTransient и services.AddScope в ASP.NET Core? 76. Что такое Kestrel? 77. Опишите ASP.NET MVC request pipeline. 78. Как в ASP.NET WebAPI настроить кэширование ответов на HTTP-запросы?   Управление памятью 79. Что такое куча и стек? Различия, принцип работы. 80. Как работает сборщик мусора? 81. Зачем нам зарезервированное слово using в C#, если в .NET есть автоматическое управление памятью? Как с этим связан disposable-паттерн и зачем такой сложный паттерн для managed и unmanaged ресурсов? 82. Какие особенности работы с Large Object Heap?   Типы данных, коллекции и структуры данных 83. Когда генерируется дженерик-класс конкретного типа - при выполнении программы или во время компиляции? 84. Что такое рефлексия? 85. Расскажите о коллекции LinkedList <T>. Чем она отличается от других коллекций? 86. Что такое индексатор? 87. Что такое immutable object? Какие преимущества дает использование immutable object? Предложите способ реализации его в .NET. 88. Когда использовать StringBuilder, а когда string? Как работает StringBuilder? 89. Что такое балансирование деревьев? 90. Что такое Key-value структуры? 100. Что такое хэш-функция и зачем нужны хэш-таблицы? 101. Какими свойствами должна обладать идеальная хеш-функция? 102. Что такое коллизии и как с ними бороться? 103. В чем заключается сложность CRUD-операций в Dictionary <K, V> в .NET? 104. Где хранятся массивы? Массивы примитивных типов? 105. В чем отличие между массивом (T [ ]) и списком (List <T>)? 106. В чем разница между IList <T> и IEnumerable <T>? 107. Зачем нужны Enumerable, Observable, AsyncEnumerable и какие модели получения данных они реализуют? 108. В чем разница между IEnumerable и IQueryable? 109. Что такое enum flags?   Базы данных 110. Расскажите о нормальных формах в СУБД. 111. Что такое индекс в БД? 112. Когда следует использовать индексы? Преимущества и недостатки. 113. Какие типы индексов существуют? Чем они отличаются? 114. Что такое ACID? 115. Какие вы знаете уровни изоляции транзакций? 116. Что такое план выполнения запроса (execution plan) в MS SQL? 117. Проблема: запрос долго выполняется. Какие есть методы ее диагностики и решения? 118. Как ORM (Entity Framework или Entity Framework Core) транслируют C# код в язык запросов базы данных? Что для этого используется?   Параллелизм 119. Для чего использовать Task.ConfigureAwait? 120. Например, есть веб-сервер, который по HTTP-запросу делает выборку из базы данных. Всего на сервере 16 тредов (threads). Каждый HTTP-request выполняет запрос в базу и ожидает результатов, в этом случае тред блокируется. Можно ли оптимизировать эту работу средствами .NET? 121. Зачем нужен ThreadPool? Опишите механику работы: как поток выделяется и возвращается обратно в ThreadPool.   Вопросы для Senior   Общее 122. Какие ещё практики, кроме ООП, использовали (AOP, FP и т. д.)? 123. Назовите три самые сложные проблемы, которые вам приходилось решать. Как вы это сделали, как пришли к этому решению? 124. Что такое слабосвязанный код? Чем он лучше сильносвязанного кода? Как бы вы достигали более слабой связности кода? 125. Использование статических классов повышает или понижает связность кода? 126. Как можно измерить performance кода? Влияет ли факт замеров на производительность? 127. Для чего используются и как работают multi-stage билды в Docker? 128. Как понять, что какая-то часть кода утилизирует много памяти или долго выполняется? Что может быть ботлнеком в разных случаях? Какие есть способы уменьшения памяти и трафика памяти? 129. Как бы вы реализовали cross-cutting concern (например, логирование, валидация, транзакции)? 130. Расскажите о Rest Maturity Model. 131. Что такое CPU и IO-bound задачи? 132. Что такое маршалинг? 133. Как работает async / await (подробно)? Почему нельзя использовать async void методы?   Платформа .NET 134. Как работает lock? Можно ли использовать структуры внутри выражения lock? 135. Что такое Expression Tree? 136. Как работает сборщик мусора (подробно)? Почему в GC три поколения, а не, скажем, пять, десять или два? 137. Как бы вы организовали трассировки Web API сервисов? 138. Как в .NET Core можно настроить хранение секретов на компьютерах разработчиков и на рабочих средах? 139. Как бы вы организовали процесс CI/CD .NET Core сервисов для их деплоймента в облачную инфраструктуру? 140. Как включить CORS в AspNetCore?   Типы данных, коллекции и структуры данных 141. Как реализованы дженерики? 142. Как создать собственный immutable-тип? 143. Как работает IEnumerable <T> (подробно)? 144. Какой алгоритм использует коллекция STACK? 145. Какие структуры данных вы реализовывали сами для платформы .NET? Расскажите, чем они отличались от стандартных реализаций. 146. Чем отличается интерфейс от абстрактного класса? В каких случаях вы использовали бы и то, и другое? 147. Почему в структуре нет конструктора по умолчанию?   Базы данных 148. Как БД сохраняет данные? 149. Какие типы БД вы знаете? 150. Как и когда БД лучше использовать? 151. Что такое денормализации? 152. Когда и какие уровни изоляции транзакций можно использовать? 153. Как в популярных СУБД реализованы принципы ACID (SQL Server, PostgreSQL и т. д.)? 154. Приходилось ли вам оптимизировать запрос в БД? Если да, то как? 155. Опишите, какие вы знаете потенциальные проблемы, связанные с параллельными запросами к БД. 156. Какую базу данных вы бы использовали для реализации distributed lock механизма? Расскажите детали реализации.   Микросервисы 157. Какую проблему решают микросервисы? 158. Какие есть способы коммуникации микросервисов? 159. Расскажите варианты реализации распределенных транзакций в микросервисах. 160. Что такое circuit breaker? 161. Каким образом вы будете налаживать систему, состоящую из множества микросервисов, если нужно отследить полный путь обработки запроса? 162. Что такое брокеры сообщений? Что такое at-least-once, at-most-once семантика? Есть ли какие-то брокеры, которые гарантируют exactly-once семантику? 163. Как должен работать код клиента брокера в зависимости от выбранной семантики? 164. Какие инструменты для работы с очередями вам известны (как в .NET, так и отдельные продукты), какой инструмент/продукт вы бы выбрали и почему?   MS Azure 165. Какие виды сервисов бывают в Service Fabric? 166. Какие особенности и ограничения Azure Table Storage? 167. Как бороться с проблемой холодного старта в Azure Functions? 168. В чем отличие очередей и топиков в Azure Service Bus?   Практические задания   Junior only Опишите, как бы вы реализовали калькулятор. Если понадобится добавить поддержку для римской системы счисления, что будете делать? Напишите программу, чтобы проверить, является ли число простым или нет. Найдите наименьший элемент в массиве. Упорядочите структуры папок в файловой системе. Напишите программу, которая симулирует fizz-buzz. Расскажите, что делает этот код, и предложите, как его улучшить. а) public bool IsArrayEmpty(string[] array) {   if (array.Length > 0)     return false;   else     return true; }   б) protected string GetClass(object url) {   string result = string.Empty;   if (SiteMap.CurrentNode != null && SiteMap.CurrentNode.Url == url.ToString())     result = "class=\"active\"";   return result; }   Middle Напишите программу для тиражирования последовательности Фибоначчи для заданного числа. Спроектируйте базу данных врачей и пациентов в SQL. Создайте stored procedure или запрос в SQL, который вернет врачей, имеющих больше, чем N пациентов. Проверьте коллекцию на наличие дубликатов. Спроектируйте thread-safe класс Singleton в C#. Надо записать некую сущность в базу данных и отправить событие в брокер сообщений. Как это сделать с минимальным риском потери данных? Имеются три сервиса. Выполняется HTTP-запрос на первый. Первый должен записать данные во второй, а второй - в третий. Как гарантировать, что данные при такой сложной коммуникации не потеряются? Как предотвратить записи дубликатов данных? Будет ли работать этот код и почему? a) SomeClass myClass = null; myClass.SomeMethod();   б) var table = GetTable(); table.Draw(); … private SomeClass GetTable() {   using(var table = new SomeClass())   {     table.ID = "www";     table.Width = "95%";     table.Controls.Add(tr);     return table;   } } Расскажите, что делает этот код, и предложите, как его улучшить: а) Shape shape = GetNextShape(); if(shape is Circle) Console.WriteLine(((Circle)shape).Radius);   б) public int Quantity {   get   {     try     {       return int.Parse(TxtQuantity.Text);     }     catch (Exception)     {       return 0;     }   } }   Что не так с кодом?   try {   SomeMethod(); } catch(Exception e) {   Log(e.Message);   throw e; }   Senior Как бы вы спроектировали FTP-сервер? Web-сервер? Хостинг картинок с разделением прав доступа? Систему, состоящую из front- и back-офисов? Создайте клон любой популярной социальной сети (Instagram, Facebook и т.д.) Допустим, есть сущность сделки (Bid). И в сделке есть список партнеров, с которыми эта сделка заключается. Сами сделки хранятся в сервисе сделок (bidding service), а партнеры - в своем сервисе (partners service). И когда показывается список сделок, на начальном скрине нужно отразить количество партнеров. Как бы вы спроектировали хранение и изображение этого счетчика? Задача на знание LINQ: с исходной коллекции данных необходимо получить новую коллекцию по определенным требованиям (например, отсортированную, без дубликатов и т. д.). Напишите программу, которая проверяет, является ли поле судоку 9×9 правильно заполненным. Реализуйте свой Select, Where, SelectMany со всеми характеристиками LINQ (отложенное исполнение, одномоментная (eager) проверка входных данных). С помощью LINQ напишите метод, который вернет такие элементы коллекции, которые делятся на N без остатка, отсортированные от наибольшего значения к наименьшему. Сигнатура метода: List <int> Filter (IEnumerable <int> collection, int n) ;. Напишите функцию, которая вернет сумму всех четных элементов массива, который передается в функцию (JavaScript).   Выражаем благодарность за подготовку статьи Алексею Краевому, Максиму Шнуренку, Андрею Ткаченку, Владу Медведовскому, Сергею Селецкому, Андрею Губскому, Сергею Мащуренку, Александру Скриннику, Андрею Соболю, Богдану Нановскому, Святославу Аксёнчикову, Ивану Корнелюку, Михаилу Пивоварову, Алексею Дерке, Евгению Гуреву, Михаилу Меркулову, Юрию Воронину.
Що нового в Angular 5

Автор: Дмитро Охріменко

Переход от AngularJS к Angular 2 был огромным шагом вперед. При этом изменилось абсолютно все, без обратной совместимости. В то же время, Angular 4 добавила новые возможности, но при этом была обратно совместимой с Angular 2 (Версия Angular 3 была пропущена из-за @angular/router, который на момент релиза был 3.x, в то время как остальные пакеты 2.x. Для того, чтобы избежать путаницы и перевести все пакеты к одной версии, третья версия была пропущена). Angular 5 - это следующее обновление, в котором изменения затронули механизмы, работающие «под капотом». Многие пользователи ITVDN задают вопрос об актуальности учебных программ видеокурса Angular Essential, который записан с использованием версии 2 и видеокурса Angular Advanced (версия 4). Angular 5 не является чем-то абсолютно новым, это улучшение существующего Фреймворка. Чтобы понять и начать использовать возможности, которые появились в пятой версии, необходимо знать основы, которые не изменились, начиная со второй версии. Что нового в Angular 5? Улучшенный компилятор. В Angular 4 компилятор перекомпилировал все файлы при каждом изменении. В Angular 5 компилятор работает только с теми файлами, в которых есть изменения, а это значит, что время на компиляцию проекта в целом значительно снизилось. Оптимизированная сборка. В Angular CLI при использовании production build совместно с версией Angular 5 по умолчанию будет применяться build optimizer, который с помощью семантического анализа кода приложения сможет значительно уменьшить его размер. Акцент на упрощение разработки PWA (Progressive Web Apps). PWA - это приложения, которые объединяют в себе лучшее, что есть в веб-приложениях и лучшее, что есть в мобильных приложениях. PWA работают независимо от выбранного браузера; адаптируются под устройство - десктоп, планшет, телефон; могут работать без подключения к Интернет или при перебоях со связью; выглядят как приложение, установленное на устройство; благодаря Service Worker содержат актуальную обновленную информацию; являются безопасными, так как работают через HTTPS; используют возможности, подобные push уведомлениям; Installable – позволяют пользователю добавить приложение на домашний экран устройства. Поддержка TypeScript 2.4. Angular 5 поддерживает версию TypeScript 2.4, что дает возможность использовать новые возможности TS: перечисления, основанные на строках, улучшения проверки типов при работе с generic-типами, week-type-detection и прочее https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html Pipes, адаптированные под локализацию. Обновленные Pipes для Date, Currency, Number и Percent, нет необходимости использовать i18n. https://github.com/angular/angular/blob/master/CHANGELOG.md#i18n-pipes Новые события Router. Используя события ActivationStart и ActivationEnd или ChildActivationStart и ChildActivationEnd, можно организовать отображения индикаторов загрузки при смене маршрута. HttpClient. Новый HttpClient был добавлен в версии 4.3, старый http клиент помечен как depreceted в новой версии. В Angular 6 старый клиент будет удален. Из преимуществ нового клиента можно выделить самостоятельное извлечение JSON без необходимости явного применения метода map и возможность применять interceptors. https://angular.io/guide/http Валидация форм. Теперь при работе с формами, c помощью свойства updateOn, можно определить, в какой момент будет происходить проверка – на событие blur или submit (вместо проверки на каждое событие input). Замена ReflectiveInjector на StaticInjector. Изменен механизм для внедрения зависимостей. Для нового StaticInjector не нужен полифил Reflect (но при использовании JIT данные полифил все равно нужно будет использовать), что может уменьшить размер приложения. Angular CLI 1.5 использует Angular версии 5. Улучшение NgZone. NgZone стала еще быстрее, также библиотеку можно отключить для применения другой библиотеки для улучшения производительности. Улучшенный RxJS. Поддержка обновлена до версии 5.5.2 и выше. Поддержка новых pipable operators https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md Angular 5 получился компактней и быстрее, чем его предшественники, и не обошелся без новых возможностей. Запуск следующей версии Angular планируется на 28 марта 2018 года. Будем ждать улучшений и новых возможностей от команды Angular.
WebForms чи MVC?

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

Введение Когда в 2008 году компания Microsoft придумала ASP.NET MVC, у многих возник вопрос: «Зачем нужна ещё одна технология ASP.NET?». Многие считают, что ASP.NET MVC не обязательно использовать, заменив на Web Forms ASP.NET. Однако, это неправда. Оба имеют свои плюсы и минусы. В статье мы рассмотрим преимущества этих двух технологий – и каждый сможет определиться, какая из них ему ближе. Мы также объясним понятия ASP.NET, ASP.NET Web Forms, MVC, ASP.NET MVC. Опытным разработчикам в ASP.NET MVC данная статья поможет переосмыслить свои концепции. Web-технологии Когда речь идёт о web-технологиях, на ум приходит классический ASP, PHP, JSP, ROR, ASP.NET Web Forms, ASP.NET MVC и другое. Классический ASP - web-технология, созданная корпорацией Microsoft. У классического ASP было два недостатка: слишком большой, неудобный исходный код и ненадёжность. К примеру, у Вас есть текстовые поля и кнопка. Нажав на кнопку, можно проверить данные, хранящиеся на сервере. Успешная проверка означает, что данные хранятся в базе, а в обратном случае выведется определённое сообщение об ошибке. В чём проблема такого сценария? Вам нужно совершить много действий. Приложение ASP.NET ASP.NET – приложение Microsoft, его структура построена на всеязыковой среде выполнения для построения динамических веб-сайтов – для создания можно использовать такие языки: C#, VB.NET и другие. ASP.NET поддерживает две модели: Web Forms и ASP.NET MVC. ASP.NET Web Forms Корпорация Microsoft первой вывела ASP.NET Web Forms из ASP, таким образом они решили множество проблем путём создания высокого уровня абстрагирования. Web Forms включает в себя postback (постит данные на заданную страницу) и ViewState. И самое интересное в том, что для ASP.NET Web Forms не требуется написания вручную ни единой строчки кода. ASP.NET 4.0 В ASP.NET 4.0 придумали, как преодолеть некоторые трудности: появилась возможность отключать и контролировать размер ViewState; с URL routing можно предоставить собственный URL вместо физического пути; в ASP.NET 4.0 мы имеем лучший контроль над ID элементов и, таким образом, интеграция с платформой JavaScript стала проще. Шаблон MVC MVC – архитектурный шаблон. Многие используют его с Java-технологией. MVC – не новое понятие, созданное Microsoft. Однако, в MVC ASP.NET нужно разобраться. До этого стоит уточнить для себя некоторые определения – в том числе, что такое MVC. Архитектурный шаблон – то, что решает наш вопрос на суб-системном уровне или на коротком уровне модуля. Речь идет о проблеме, связанной с архитектурой проекта. Это говорит о том, как можно разделить системы, а в частности - почему. Создаются библиотеки классов, компоненты, веб-сервисы, чтобы решить данный вопрос. MVC – архитектурный шаблон, позволяющий уловить тонкую связь между input-логикой, бизнес-логикой и UI-логикой. Платформа ASP.NET MVC ASP.NET MVC – еще одна платформа web-приложений от Microsoft. В ней устранены недостатки, имеющие место в предыдущих, подобного типа платформах. Эта платформа построена на всеязыковой среде выполнения (CLR) и полностью основана на MVC-архитектуре. Источник: http://www.codeproject.com/Articles/528117/WebForms-vs-MVC#Visual_in_Web
Правила застосування основних тегів HTML5

Автор: Антон Гончаров

Введение Все мы уже знаем (ну или что-то слышали об) основных правила применения элементов разметки HTML5. Появилось много "плюшек" и “вкусностей” в новой спецификации HTML. Вместе с тем, появились новые элементы разметки. Но не все помнят/знают, как их использовать правильно. Коротко остановлюсь на главных нововведениях HTML5: Новые элементы: header, footer, section, article, video, audio, progress, nav, meter, time, aside, canvas; Новые значения для атрибута type тега ; Новые атрибуты HTML5 для элементов, такие как: dragable, contenteditable, hidden, contextmenu, data-*, dropzone, role, spellcheck[8] и т.д.; Атрибуты class, dir, id, lang, style, tabindex, title, существовавшие в HTML4, теперь можно применять ко всем елементам HTML разметки; Устаревшие элементы HTML страницы, которые частично поддерживаются и не рекомендуются к ипользованию: acronym, applet, basefont, big, center, dir, font, frame, frameset, isindex, noframes, strike, tt, u. Итак,  более детально рассмотрим, как же правильно использовать основные новые теги. Элемент Элемент <main>содержит главную информацию вашего сайта. Такие повторяющиеся элементы как логотип, окно поиска, меню навигации не рекомендуется вкладывать в <main>. Также не стоит помещать сам элемент <main> внутрь элементов <article>, <aside>, <header>, <footer> или <nav>. Элемент В элемент <article> следует помещать тот контент, который может быть удален без ущерба для всего сайта. К примеру, краткое описание новостей, рекламный баннер, статья, комментарии. Можно вкладывать <article> в <article>, что будет связывать вложенные элементы <article> с родительским. Элемент Элемент <header>, как  понятно из названия, используется для оглавления отдельного контента или всей страницы. Должен содержать  заглавие, дату статьи и т.д. Элемент Элемент <footer> служит для предоставления информации об авторе статьи/страницы, ссылки на авторские права и т.д. Обычно является прямым потоком тега <body> (помещается сразу за элемент <body>). Элемент Этот элемент содержит информацию об окружающем контенте, дополнительную информацию пользователю. Может содержать такой элемент, как <nav>, сноски, ссылки и т.д. Элемент   Предназначен для предоставления контактной информации о статье или всей странице. Стоит отметить, что этот элемент часто помещают в , для размещения ссылок для связи с авторами страницы. Элемент Элемент <nsfw> (англ. - Not Safe For Work – небезопасно для отработки) используется для размещения на странице контента сомнительного характера. Часто этот тег используют для размещения порнографии. Чтобы браузер не отображал такой контент, используют CSS код  nsfw {display: none ;} Элемент Элемент предназначен для размещения видео контента на странице. Для корректного отображения контента стоит прописать дополнительно атрибуты width, height, src, controls. Ваш код будет выглядеть примерно так:   <video width="840" height="480" src="../video/myVideo.mp4" controls> video>   Если же Вы хотите разместить у себя на странице видео, которое расположено на сайте youtube.com. Вам стоит зайти на страницу c видео, правой кнопкой мыши нажать на видео, и из выпадающего меню выбрать “Получить код для встраивания”. Копировать код из “попап” окошка. В разметке вашего сайта, в нужном вам месте, кликнуть правой кнопкой мыши и выбрать “Вставить”. У вас получится примерно такой код:   <iframe width="854" height="510" src="https://www.youtube.com/embed/_giinWWrNlQ" frameborder="0" allowfullscreen>iframe>   В свою очередь, элемент > создает область, которая позволяет загружать любой документ в себя. Элемент Элемент <audio> позволяет добавить на страницу аудио дорожки. Также в HTML5: Реализована возможность добавления на станицу геолокационных карт, а также определения местоположения пользователя в данный момент. Теперь мы можем рисовать с помощью технологии canvas. А также использовать 3D графику. Стало возможным просто перетягивать документы и прикреплять к письму. И еще много новых "плюшек", которые вы можете узнать и научиться их использовать, пройдя наши курсы в учебном центре CyberBionic Systematics. Всем удачи и хорошего кода)
Notification success