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

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

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

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

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

Результати пошуку за запитом: design pattern
Реалізація успадкування перерахувань за допомогою розширення для 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 English для українців

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

Друзі, всім привіт! Запрошуємо на новий безкоштовний онлайн курс «IT English» для українців від наших партнерів CyberBionic Systematics та Englishdom! Англійська мова грає вагому роль для кожного ІТ-спеціаліста, тому інвестиції часу у її вивчення ніколи не будуть марними. І у вас є чудова можливість її  вдосконалити! Початок курсу і тривалість Курс стартує 7 лютого о 18:00. Заняття проходитимуть по вівторкам та четвергам в цей же час – всього десять занять тривалістю 1 година. Програма курсу: Effective Teams – 7 лютого Software Life Cycle – 9 лютого Deadlines and Project plans – 14 лютого Requirements – 16 лютого Design concepts – 21 лютого Development – 23 лютого Testing – 28 лютого Mobile app – 2 березня Gamification – 7 березня Data storage – 9 березня Що ви отримаєте на курсі? Ви опануєте базову ділову лексику, граматику, усталені конструкції та вирази зi сфери інформаційних технологій. Курс дозволить поліпшити свої знання англійської та отримати сертифікат після успішного складання фінального тесту. Ментор – Анастасiя Шамрай, викладач з 5-річним досвідом, закiнчила Brooklyn College NY (USA) та здобула вищу освiту у педагогiчному унiверситетi (Вінницький державний педагогічний університет ім. М. Коцюбинського). Для кого цей курс? Курс підійде в першу чергу тестувальникам і розробникам, але також буде корисний іншим ІТ-спеціалістам – Product та Project менеджерам, бізнес аналітикам тощо. Рівень англійської, який слід мати для комфортного проходження курсу – B1 (Intermediate). Як буде проходити навчання Заняття проходитимуть у форматі живих вебінарів (двічі на тиждень тривалістю 1 година), на яких ви зможете задавати питання спікеру і отримувати на них відповіді. Курс поєднує теорію і практику, будуть домашні завдання для закріплення вивченого матеріалу, а також спілкування у телеграм чаті з одногрупниками. Подарунки! На тих, хто найкраще себе проявить під час проходження курсу, чекають спеціальні подарунки! Деталі – за посиланням в кінці. Умови участі Безкоштовно, за попередньою реєстрацією. Організатори курсу: Englishdom – онлайн-школа для вивчення англійської мови з персональним викладачем на інтерактивній онлайн-платформі. Englishdom входить до ТОП лідерів ринку edtech в Європі. CyberBionic Systematics – сертифікований навчальний центр, партнер Microsoft, авторизований центр міжнародної сертифікації VUE Pearson. З 2007 року CyberBionic Systematics надає послуги з професійної підготовки та підвищення кваліфікації IT-фахівців, а також on-line навчання для початківців за напрямками FrontEnd, Java, .NET та Python. Подробиці на сайті CyberBionic Systematics
Lviv IT Arena 2016

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

Lviv IT Arena 2016 соберет во Львове более 2500 ІТ специалистов из  Украины и Европы. В 2015 году Lviv IT Arena назвали лучшим IТ-событием года. В этом году организаторы решили замахнуться не на украинский, а уже на европейский масштаб. Они планируют объединить более 2500 IТ-экспертов, на стадионе Арена Львов с 30 сентября по 2 октября. Как и в прошлом году, событие будет иметь не только традиционные три потока Business, Product и Technology, но и тех-експо, и соревнования стартапов за право питчить свой проект перед международными инвесторами. А еще Lviv IT Arena 2016 будет полностью англоязычной, ведь, как отмечают организаторы, 40% участников конференции будут из других стран. На конференции уже выступали спикеры из таких компаний как Facebook, IBM Design, Amazon, Petcube, HP, Epson, SAP и Microsoft. В этом году организаторы события обещают не менее звездный состав. Участников ждут спикеры со всего мира, которые будут говорить о трендах и текущих разработках. Среди них – Алехандро Данилишин с крупнейшей в мире компании профессиональных услуг Deloitte, дизайнеры Ирен Перейра и Антон Репоннен, которые работали с Nickelodeon, BBC и National Geographic, Aaron Erickson с Thought Works и Сэми Энергин, который работает над HoloLens в Microsoft. Кроме докладов, событие готовит масштабное тех-экспо с новыми разработками и продуктами. Основные тренды, которые покажут – дроны, работы, дополненная реальность, wearables, умные дома и города, а также 3D-принтеры и IТ-решения. Формат конференции Lviv IT Arena делает ее интересной не только для разработчиков и тестеров. Событие объединит бизнес аналитиков, PMив, UI / UX дизайнеров, предпринимателей и стартеров. Организаторы уверены, что именно это гарантирует качественный нетворикинг, каждый сможет найти не только единомышленника, но и делового партнера или инвестора на событии. «Lviv IT Arena выходит на новый уровень. Мы хотим быть не только лучшим IТ-событием страны, но одним из крупнейших в Восточной Европе. Поэтому в этом году Lviv IT Arena выходит на новый международный формат, чтобы создать достаточно пространства для бизнеса и нетворкинга. В этом году мы приглашаем не только иностранных спикеров, но и 2500 участников из всего мира.» - делится планами соорганизатор события Степан Веселовский, CEO Lviv IT Cluster. Организаторы: Lviv IT Cluster, Eleks, LITS, Startup Depot, GDG, Больше о конференции, спикерах, а также расписание события – на официальном сайте. Регистрируйтесь на сайте с промо-кодом Arena4ITVDN и получите скидку 10%.  Дата: 30.09. – 02.10. Место: стадион Арена Львов, ул. Стрийская, 199 Контакты: info@itarena.lviv.ua, 067-340-09-66
Що нового в Angular 4?

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

Что нового в Angular 4? Наконец, когда обновленная технология предстала перед нами, мы можем приступить к ее изучению! То, что новый представитель семейства Angular приобрел новый номер, свидетельствует об инновационных изменениях. Но все же встает вопрос: почему Angular 4, а не 3? Все достаточно просто: так как пакет маршрутизатора был уже представлен в версии 3.x, вместо того, чтобы вносить все нововведения в версию 3.0, а маршрутизатор перенести в 4.0, разработчик решил объединить все в версии 4.0. Не стоит волноваться касательно обновления Ваших приложений к новой версии Angular: так как тех самых инновационных изменений в принципе оказалось не слишком много, процесс установки не занял больше нескольких минут. Ничего особо страшного. Среди дополнительных требований стоит упомянуть версию TypeScript 2.1 или выше (раньше требовалась только 1.8+). К тому же некоторые элементы интерфейса были изменены или вовсе упрощены (редко используемые OpaqueTolen или SimpleChange). Плюс, TypeScript 2.1 и 2.2 приобрел целый ряд прекрасных особенностей, которые теперь поддерживаются в Angular 4. К примеру, в скором времени Вы сможете использовать TypeScript-опцию stringNullChecks. Итак, что именно позволяет нам новая версия Angular? Давайте углубимся!   Ahead of Time (AoT) компиляция: обновленный движок представлений Пожалуй, это наиболее значимое изменение, пусть даже Вы, как разработчик, не ощутите разницы. Как Вы, наверно, знаете, в режиме AoT Angular компилирует Ваши шаблоны во время сборки, после чего генерирует JavaScript код (в отличие от режима Just in Time, когда компиляция происходит во время выполнения приложения). Режим AoT обладает целым рядом преимуществ, например, в случае неправильного построения шаблона ошибка возникнет во время сборки, а не во время работы приложения, как раньше. Эта методика позволяет ускорить запуск приложения, так как генерация JS-кода уже произведена. Также Вам не нужно отправлять Angular-компиляторы пользователям, что в теории должно уменьшить размер пакетов. Почему в теории? Потому что, как правило, обратная сторона медали в том, что сгенерированный JavaScript-код обычно больше, чем нескомпилированные HTML-шаблоны. Таким образом, в большинстве приложений с использованием AoT размер пакета де-факто увеличивается. Разработчики Angular хорошо поработали над новым движком представлений, что позволило производить меньше кода при использовании Ahead of Time компиляции. Эффект на больших приложениях не заставил себя ждать. Без падений производительности. Ежели говорить в цифрах, размер пакета стал: С 499 КБ до 187 КБ (или с 68 КБ до 34 КБ после gzip) С 192 КБ до 82 КБ (или с 27 КБ до 16 КБ после gzip) Достаточно большая разница! Интересно отметить, что в своих дизайн-документах команда Angular сравнивает производительность (как в контексте времени выполнения, так и в контексте нагрузки на память) с базовой имплементацией (лучшим «дефолтным» кодом JS, который они только могут написать) Angular 2.x и InfernoJS (быстрая React-подобная имплементация). Универсальность Масса работы была проделана над универсальным проектом, позволяющим производить серверный рендеринг. Когда раньше этот тип проекта поддерживался в основном силами сообщества, теперь, начиная с Angular 4, поддержка приобрела официальный характер. Анимации Анимации теперь обзавелись собственным пакетом @angular/platform-browser/animations (одна из вещей, которая может быть изменена в процессе обновления). Что это значит? Это значит, что Вам больше не нужно нагружать пакеты ненужным кодом, если вы не используете анимации. Шаблоны ng-template вместо template Тэг template устарел. Вместо него используйте ng-template. Хотя и первый вариант все еще работает. Вообще, было немного странно использовать template, так как это реально существующий HTML-тэг. Теперь же Angular обзавелась собственным ng-template. В случае, если вы используете устаревший template, будет выдано соответствующее предупреждение: это в значительной мере упростит обнаружение подобного кода в проектах. Else С новой версией Angular 4 появилась возможность использовать оператор else: <div *ngIf="races.length > 0; else empty"><h2>Races</h2></div> <ng-template #empty><h2>No races.</h2></ng-template> As Еще одно синтаксическое нововведение. Ключевое слово as позволяет упростить синтаксис let. As позволяет хранить результат переменной шаблона для дальнейшего использование в элементе. К примеру, сия особенность может быть достаточно полезной для хранения коллекции: <div *ngFor="let pony of ponies | slice:0:2 as total; index as i">   {{i+1}}/{{total.length}}: {{pony.name}} </div> Или даже более полезной, если один раз использовать pipe с async. Вместо плохого и некрасивого: <div>   <h2>{{ (race | async)?.name }}</h2>   <small>{{ (race | async)?.date }}</small> </div> Вы можете использовать: <div *ngIf="race | async as raceModel">   <h2>{{ raceModel.name }}</h2>   <small>{{ raceModel.date }}</small> </div> Различные виды pipe Titlecase Angular 4 презентует новый pipe: titlecase. Он позволяет переводить первую букву каждого слова в верхний регистр: <p>{{ 'ninja squad' | titlecase }}</p> <!-- will display 'Ninja Squad' --> Http Задание параметров поиска Http-запроса было упрощено: http.get(`${baseUrl}/api/races`, { params: { sort: 'ascending' } }); Раньше вам необходимо было произвести следующее: const params= new URLSearchParams(); params.append('sort', 'ascending'); http.get(`${baseUrl}/api/races`, { search: params }); Test Переопределение шаблона во время теста также было упрощено: TestBed.overrideTemplate(RaceComponent, '<h2>{{race.name}}</h2>'); До этого мы обычно писали так: TestBed.overrideComponent(RaceComponent, {   set: { template: '<h2>{{race.name}}</h2>' } }); Сервисы Meta Для получения содержимого или обновления meta-тэгов был введен новый сервис: @Component({   selector: 'ponyracer-app',   template: `<h1>PonyRacer</h1>` }) export class PonyRacerAppComponent { constructor(meta: Meta) {     meta.addTag({ name: 'author', content: 'Ninja Squad' });   } } Формы Валидаторы Новый валидатор позволит объединить существующие required, minLength, maxLength, и pattern. email позволит провести валидацию e-mail адреса (если Вы планируете просто обойтись подходящими регулярными выражениями – удачи в поисках). Сравнение выбранных опций Для сравнения выбранных опций была добавлена новая директива: compareWith: <select [compareWith]="byId" [(ngModel)]="selectedPony">    <option *ngFor="let pony of race.ponies" [ngValue]="pony">{{pony.name}}</option> </select> byId(p1: PonyModel, p2: PonyModel) {    return p1.id === p2.id; } Маршрутизатор ParamMap Для представления параметров URL был введен новый интерфейс: ParamMap. Вместо использования params или queryParams, отныне Вам стоит использовать paramMap или queryParamMap, так как они позволяют выбрать между get() для получения значения или getAll() для получения всех значений (так как параметры запросов могут иметь несколько значений, к примеру). const id = this.route.snapshot.paramMap.get('ponyId'); this.ponyService.get(id).subscribe(pony => this.pony = pony); Или как здесь:   .map((params: ParamMap) => params.get('ponyId'))   .switchMap(id => this.ponyService.get(id))   .subscribe(pony => this.pony = pony); CanDeactivate Интерфейс CanDeactivate теперь обзавелся дополнительным опциональным параметром, содержащим следующее состояние (то, куда Вы собираетесь перейти). Теперь можно реализовать «умную логику», когда пользователь может покинуть текущий компонент в зависимости от того, куда он или она направляется. I18n Интернационализация также медленно, но верно улучшается. К примеру, ngPlural теперь упрощен: <div [ngPlural]="value">   <ng-template ngPluralCase="0">there is nothing</ng-template>   <ng-template ngPluralCase="1">there is one</ng-template> </div> А теперь давайте сравним с тем, что было раньше: <div [ngPlural]="value">   <ng-template ngPluralCase="=0">there is nothing</ng-template>   <ng-template ngPluralCase="=1">there is one</ng-template> </div> Только что мы добавили целую главу к нашей электронной книге, включая несколько юз-кейсов и прочее! Подведем итоги Релиз Angular 4 привносит множество улучшений и действительно востребованных инноваций в сферы размера генерируемого кода, сохраняя в целом концепцию предыдущей версии Angular. Благодаря этому обновление технологии не должно вызвать затруднений. Автор перевода: Евгений Лукашук Оригинал статьи
C# vs Java: яку мову загального призначення краще обрати

Автор: Yoshitaka Shiotsu

Що таке C#? Що таке Java? C# vs. Java: основні подібності. C# vs. Java: основні відмінності. Коли варто використовувати C# або Java? C# vs Java - яка із загальноцільових, об'єктно-орієнтованих мов програмування найкраще підійде вам для роботи? Вони обидві мають великі бібліотеки, які можна використовувати для створення застосунків для ПК, веб, мобільних пристроїв та інших платформ. Обидві мають великі спільноти захоплених шанувальників і багато онлайн-підтримки. Маючи так багато спільного, вибір правильної мови потребує більш тонкого, ретельного підходу. Давайте докладніше розглянемо подібність і різницю між C# і Java. Що таке C#? C# - це мова програмування загального призначення, яка вперше з'явилася в 2000 році в рамках ініціативи Microsoft .NET. Вона була розроблена для загальної мовної інфраструктури (CLI) – відкритої специфікації, розробленою Microsoft та стандартизованою ISO та ECMA. Застосунки C# скомпільовані в байт-код, який може запускатися при реалізації CLI. Що таке JAVA? Java, спочатку випущена Sun Microsystems в 1995 році, є мовою програмування загального призначення, яка була розроблена з конкретною метою, що дозволяє розробникам «write once, run anywhere», тобто написати код один раз і запускати в будь-якому місці. Java-застосунки скомпільовані в байт-код, який може запускатися при реалізації віртуальної машини Java (JVM). Подібно до CLI, JVM допомагає подолати розрив між вихідним кодом і 1 і 0, які розуміє комп'ютер. C# VS. JAVA: ОСНОВНІ ПОДІБНОСТІ Поява як Java, так і C#, тісно пов'язані з переходом від низькорівневих мов програмування, як-от мови програмування C++, до мов більш високого рівня, котрі компілюються в байт-код. Байт-код можна запустити на віртуальній машині. З цим пов'язаний ряд переваг, насамперед, можливість написання коду, який буде зрозумілий людині та працюватиме на будь-якій апаратній архітектурі, на якій встановлено віртуальну машину. Якщо відкинути синтаксичні чудасії вбік, то не дивно, що ці дві подібні між собою мови такі популярні для розробників додатків. Ось декілька основних подібностей між C# і Java: Безпека типів. Помилка типу виникає коли тип даних одного об'єкта помилково призначається іншому об'єкту, створюючи ненавмисні побічні ефекти. І C#, і Java працюють на те, щоб гарантувати виявлення таких типів незаконних приведень під час компіляції. Якщо приведення не може бути застосовано до нового типу, то під час виконання такі винятки будуть видалені. Збирання сміття. У мовах більш низького рівня управління пам'яттю може бути стомлюючим, адже потрібно пам'ятати про те, що необхідно правильно видалити нові об'єкти, щоб звільнити ресурси. У С# та Java є вбудоване збирання сміття, яке допомагає запобігти витоку пам'яті шляхом видалення об'єктів, які більше не використовуються програмою. Витоки пам'яті все ще можуть виникати, але завдяки основам управління пам'яттю - це вже не ваша проблема. Одиночне наслідування. Обидві мови підтримують одиночне наслідування – це означає, що існує лише один шлях з будь-якого базового класу до будь-якого з його похідних класів. Це обмежує ненавмисні побічні ефекти, які можуть виникати за наявності кількох шляхів між кількома базовими класами та похідними класами. Diamond pattern – книжковий приклад цієї проблеми. Інтерфейси. Інтерфейс є абстрактним класом, де всі методи абстрактні. Абстрактним методом є той метод, який оголошено, але він не містить подробиць його реалізації. Код, який визначає будь-які методи або властивості, визначені інтерфейсом, повинен надаватися класом, що його реалізує. Це допомагає уникнути двозначності патерну diamond, оскільки завжди зрозуміло, який базовий клас реалізує даний похідний клас під час виконання. Результатом є чиста ієрархія лінійних класів одиночного наслідування у поєднанні з деякою універсальністю множинного наслідування. Фактично використання абстрактних класів є одним із способів множинного наслідування мов, які можуть подолати проблему паттерну diamond. C# VS. JAVA: ОСНОВНІ ВІДМІННОСТІ Важливо пам'ятати, що C# бере свій початок у бажанні Microsoft мати власну «Java-подібну» мову для платформи .NET. Оскільки C# не створювався у вакуумі, нові функції були додані та налаштовані для вирішення проблем, з якими стикалися розробники Microsoft, коли вони спочатку намагалися створити свою платформу Visual J++. У той же час спільнота Java з відкритим вихідним кодом продовжувала зростати і між цими двома мовами розвивалася гонка технічних озброєнь. Ось деякі з основних відмінностей між C# та Java. Windows vs open-source. Хоча існують реалізації з відкритим вихідним кодом, C# в основному використовується в розробці для платформ Microsoft - .NET Framework CLR і є реалізацією CLI, що найбільш широко використовується. На іншому кінці спектру Java має величезну екосистему з відкритим вихідним кодом і у нього відкрилося друге дихання частково завдяки тому, що Google використовує JVM для Android. Підтримка узагальнень (Generics). Generics покращує перевірку типів за допомогою компілятора, в основному видаляючи приведення з вихідного коду. У Java засоби узагальнень реалізуються з використанням стирань. Параметри загального типу «стираються», а при компіляції до байт-коду додаються приведення. C# також використовує узагальнення, інтегруючи його в CLI та надаючи інформацію про тип під час виконання, що дає невелике збільшення продуктивності. Підтримка делегатів (вказівників). У C# є делегати, які по суті служать як методи, які можуть бути викликані без знання цільового об'єкту. Для досягнення такої ж функціональності в Java необхідно використовувати інтерфейс з одним методом або іншим способом обходу, який може вимагати нетривіальної кількості додаткового коду в залежності від програми. Перевірювані винятки: Java розрізняє два типи винятків – перевірювані та неперевірювані. C# вибрав більш мінімалістський підхід, маючи лише один тип виключення. Хоча здатність ловити винятки може бути корисною, вона також може негативно впливати на масштабованість та контроль версій. Поліморфізм: C# та Java використовують дуже різні підходи до поліморфізму. Java допускає поліморфізм за замовчуванням, C# повинен викликати ключове слово «virtual» в базовому класі і ключове слово «override» у похідному класі. Перерахування (Enums): в C# перерахування являють собою прості списки іменованих констант, де базовий тип має бути цілим. Java представляє перерахування більш глибоко, розглядаючи його як іменований екземпляр типу, що спрощує додавання користувацької поведінки до окремих перерахувань. Коли варто використовувати C# або Java? Мова, яку ви зрештою вирішите використовувати, багато в чому залежатиме від платформи, яку ви обрали для свого проєкту. Сьогодні C# використовується в основному для реалізації CLI на .NET Framework, Mono та Portable.NET. Якщо ваше програмне забезпечення або веб-додаток створюються для Windows, C# працюватиме найкраще з набором технологій .NET. Тим не менш, якщо ви хочете розробляти для Unix, Linux або інших платформ поза межами платформи Microsoft, екосистема з відкритим вихідним кодом - Java - найкращий вибір. Спільнота постійно створює нові бібліотеки та інструменти. З'явилися нові потужні мови, такі як Scala, Clojure та Groovy, і вони також базуються на JVM. До того ж це непогано, що більшість реалізацій JVM є загальнодоступними та безкоштовними. Java – основна мова розробки, яку використовує Google для Android – найбільшої мобільної операційної системи у світі в даний час. Майте на увазі, що перераховані вище переваги незначні, і жодна з мов не зникне найближчим часом. Обидві мови існують досить довго і, насправді, ви не зможете нічого такого побудувати однією мовою, чого б не змогли побудувати іншою. Підсумок: виберіть мову, яка найкраще підходить для платформи вашого проєкту. Джерело: https://www.upwork.com/hiring/development/c-vs-java/
Сервіс пошуку роботи в IT для Junior спеціалістів на ITVDN

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

Головна задача освітньої платформи ITVDN – дати нашим студентам ті знання та навички за обраною ІТ-спеціальністю, які будуть достатніми для успішного початку кар’єри. Однак опанування професії – лише перша сходинка. Не меншим випробуванням є ще й пошук роботи та проходження співбесід. Ми ж не зупиняємося на навчанні і хочемо допомогти тим, хто вже його завершив і готовий зробити наступний крок. Тому ми з радістю представляємо наш новий розділ на сайті ITVDN – “Вакансії”. Давайте ми познайомимо вас з ним детальніше! Для чого ми створили цей розділ Головна мета – допомогти новачкам розпочати свою кар’єру в ІТ-індустрії, а саме – спростити процес пошуку першої роботи/стажування та збільшити шанси на успішний старт. Наразі це дуже актуально, оскільки ринок ІТ має сильну конкуренцію серед новачків. Ситуація ще більше погіршилася внаслідок коронавірусних обмежень та повномасштабної війни. Завдяки розділу “Вакансії” ITVDN стає не лише платформою для навчання, а й надійним помічником в розбудові успішної кар’єри у високодинамічній сфері ІТ. Для кого це корисно? Розділ “Вакансії” – це класна можливість для пошуку першої роботи тим, хто: Вже закінчив навчання за спеціальністю і знаходиться в активному пошуку своєї першої роботи або стажування в ІТ. Знаходиться в процесі навчання і хоче паралельно моніторити ІТ-ринок, аби підтримувати мотивацію і бути в курсі поточних вимог до початківців. Ми публікуємо вакансії рівнів Intern, Trainee та Junior від наших партнерів, чий стек технологій достатньо наближений до того, який ви можете опанувати у нас. Це дозволяє новачкам швидше знаходити першу айтішну гавань, а роботодавцям – набирати в команду потрібних кандидатів, з яких можна виростити кваліфікованих ІТ-спеціалістів. Вакансії можуть охоплювати широкий спектр спеціальностей: від розробки популярними мовами JavaScript, Python, C# та Java до дизайну, тестування, створення ігор та розробки мобільних застосунків під Android та iOS. Функціонал сторінки вакансій на ITVDN На головній сторінці перелік доступних вакансій, але при натисканні на кнопку “Усі вакансії” ви потрапляєте на сторінку з різноманітними фільтрами. Користуючись ними, ви можете відібрати саме ті пропозиції, які вас цікавлять. Серед доступних фільтрів: спеціальність, тип роботи, вид зайнятості, рівень. Обравши конкретну спеціальність, ви можете ознайомитися з деталями та відгукнутися на неї, вказавши необхідні дані: прізвище та ім’я, імейл, номер телефону, зручний для спілкування месенджер, та залишивши власний коментар (за бажанням). Також є можливість завантажити резюме.  Нижче на сторінці “Вакансіїї” ви знайдете перелік важливих та корисних вебінарів, які допоможуть скласти резюме, підготуватися до співбесіди, гарно проявити себе в новій компанії, успішно пройти стажування тощо. Запрошуємо до співпраці ІТ-компанії Запрошуємо представників ІТ-компаній до співпраці на взаємовигідних умовах! Ми готові надати допомогу у пошуку кандидатів на позиції Intern / Trainee / Junior, які відповідають вашим вимогам, розміщуючи інформацію про вашу компанію та вакансії на сайті ITVDN у розділі "Вакансії". Розміщення вакансій є безкоштовним. Крім того, ми індивідуально інформуємо потенційних кандидатів про відкриття нових можливостей.  Найбільше у нас початківців, які пройшли навчання за такими напрямками: FrontEnd; Python (BackEnd); C# / .NET (BackEnd); Java (BackEnd); Node.js. Окремою популярністю користуються напрямки C++, QA, Android, iOS, PHP, Ruby, Databases, UI/UX Design. Наша компанія також надає сервіс онлайн тестування, який допоможе перевірити рівень знань кандидатів за різними технологіями та напрямками. Це дозволить виявити найкращих претендентів, котрі відповідають вашим вимогам.  Також ми будемо раді запросити вас проводити онлайн зустрічі з нашими випускниками, щоб ви могли розповісти більше про вашу компанію та пропозиції нашим студентам. Об’єднавши наші зусилля, ми зможемо підготувати майбутніх ІТ-фахівців, які стануть цінними членами вашої компанії. Давайте розвивати українське IТ разом! Щоб зв’язатися з нами, перейдіть на сторінку “Вакансії”, натисніть на кнопку “Напишіть нам” нижче і заповніть невелику форму. Додатково залишимо контакти нашого HR-спеціаліста, який з радістю відповість на всі ваші запитання за даною темою. Контакти для зв’язку: Вікторія Чабан Email: hr@cbsystematics.com Telegram: https://t.me/hr_cbs Skype: Viktoriia Chaban (+380937595777)
Devoxx Ukraine 2019

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

Devoxx Ukraine 2019 – международная Java конференция, представленная в Украине компанией EPAM и Java User Group of Ukraine. Когда: 1-2 ноября, 2019 Где: «M82», ул. Межигорская 82. Киев, Украина Devoxx Ukraine является частью семьи Devoxx, а также одной из крупнейших международных технологических конференций в Украине: Более чем 60 международных спикеров – только признанные профессионалы в мире Java и не только; Участники со всего мира; Передовые технологии и тренды:  Общение с лучшими экспертами и многое другое! Среди представленных на Devoxx Ukraine треков каждый участник конференции, независимо от специализации, сможет найти для себя нужное направление: Java Language (Java Language, Java SE, JDK, Graal VM, Corretto VM, performance tuning, concurrency, etc.)  Methodology and Culture (Software development methodologies, developer culture and related subjects) Cloud, Containers & Infrastructure (Cloud-native, Service mesh, Quarkus IO, Kubernetes, Docker, Istio, PaaS and serverless. Building anything and deploying it anywhere. SRE/DevOps/Chaos engineering as a culture) Server Side Java (Frameworks and libraries which are mainly used on the server-side: Spring, Jakarta EE, Reactive frameworks, ORM, Messaging, Databases. Microservices frameworks)  Architecture (Share howtos, experience, best-practices to build a system and do it right. Microservices, Distributed systems or Monolithic design. Blockchain. Also, something which can be explained without dive into the code)  Modern Web (Frontend technologies, languages and tooling to build modern browser and mobile apps (JS/Node/TypeScript/React/Kotlin JS. Thick-clients working via Web) Big Data & AI (Big Data, Fast Data, Stream processing, NoSQL, Machine learning, Deep Learning, Neural Networks, TensorFlow, etc) Programming Languages (Other languages running on the JVM, functional, mobile and emerging languages. The tools, libraries and best practices) Security (Encryption, defensive practices, tools and technologies to be secure, security testing) Выступления будут проходить в различных форматах, а именно: Birds of a feather (BOF) – неофициальные, вечерние одночасовые дискуссии в небольших группах; Keynote – 45-минутный доклад; Regular talk – 45/60-минутная презентация; Deep-dive / HOL – 3-часовая презентация; Small Talk – 25-минутный доклад в неформальной обстановке. В прошлом году конференция побила рекорды за все время проведения в Украине по количеству поданных докладов, а также по количеству участников (1300) и мы продолжим работать над тем, чтобы в этом году вы имели возможность услышать лучших экспертов и получить уникальный опыт общения с коллегами и единомышленниками.   Официальный сайт: devoxx.org.ua. Как это было в 2018 году: видео и фото. Используйте промо-код itvdn5 чтобы купить билет со скидкой 5%. По любым вопросам пишите нам: contact@devoxx.org.ua.
Конференція Lviv IT Arena: новітні технології, сучасні тренди, бізнес та майбутнє ІТ індустрії!

Автор: Ирина Музыка

2-4 октября на стадионе «Арена Львов» состоится самое ожидаемое ІТ событие года – конференция Lviv IT Arena. Мероприятие станет самым крупным в истории подобных конференций событием Западной Украины. Lviv IT Arena фокусируется на основных IT трендах развития индустрии в Украине и мире. Концепция охватывает полный цикл разработки ПО. Также конференция охватывает этапы развития ІТ компании – от стартапа до системной компании, а секции конференции сформированы таким образом, что она будет интересна для всех ІТ специалистов, руководителей компаний, проектных менеджеров, тестировщиков, HR специалистов, а также тех, кто только планирует создать собственную компанию. Участников ждет множество сюрпризов – тест-драйв и фотоссесия с Tesla, Google Glass, вечеринки и развлечения. Посетив конференцию, участники из разных уголков Украины, Европы и мира смогут услышать около 100 спикеров международного уровня, которые выступят в 11 секциях Lviv IT Arena. Программа и билеты на конференцию доступны на сайте. Startup (Workshop Day – работа с идеями, советы специалистов и раскрытие основных инструментов для создания успешного стартапа - Lean Startup, Business Model Canvas, Financial Model, Presentation и Startup Stars Day, во время которого выступят самые крутые основатели украинских технологических стартапов – Петр Бондаревский (Internet Investments Group), Андрей Колодюк (Aventures Capital), Алексей Орап (YouScan), Дмитрий Бариский (Smart Atoms) и Максим Ищенко (Dou.ua). В конце дня состоится питчинг перед бизнес-ангелами среди избранных стартапов со всей Украины, Молдовы, Белоруси. Зарегистрировать свой стартап можно тут. Скидка на 2 билета для зарегистрированного стартапа – 50%. Mobile (доклады и дискуссии о будущем мобильных телефонов и перспективы развития - personalization, context analysis, wearables, IoT, M2M, а также возможности мобайла сегодня - NFC, face & object recognition, augmented reality. Среди спикеров секции - Myriam Joire (Pebble), Cyril Lashkevich (Viber), Markiyan Matsekh (Eleks) и др. UI/UX (кейсы, доклады, обмен опытом, интерактив в воркшопах от специалистов, работающих в ведущих дизайн-бюро и на всемирно известные бренды. Узнайте все о сути хорошего дизайна – как начать работу, откуда брать идеи и вдохновение, как правильно заниматься саморазвитием и организовать синергию дизайнера с клиентом. О минимализме, функциональном дизайне, User Experience Design в докладах Максима Ткачука (Trendkill designers), Павла Колодяжного (Design bureau “make”), Юрия Бабича (COXO) и др. Google Development (перспективы роста бизнеса с платформой Google+, воркшопы по созданию приложений на платформе Google App Engine от Google Developer Expert'a, cloud технологии, привлечение дополнительной аудитории с Google+ и все о wearables – как о реальности, а не туманной перспективе в докладах лучших специалистов - Javier Ramirez (Google Developer Expert on the Cloud Platform, founder at teowaki), Panayiotis Lipiridis (Startup), Gerwin Sturm (Owner & Developer at FoldedSoft e.U.), Julianna Göbölös-Szabó (Prezi) и др. QA (автоматизация тестирования, современные тренды направления – автоматизация тестирования игр и больших объемов данных, тестирование ПО для медицинских устройств и краудсорсинговое тестирование. Обо всем этом – в докладах Андрея Дзыни (Spotify), Святослава Рымара (SoftServe), Дмитрия Миндры (Unity Technologies) и др. Data Science (о технологиях Яндекс, искусственном интеллекте в создании беспилотников, технологии Apache Hadoop и Amazon Redshift на примере выполнения ETL процесса для обработки медицинских данных, о мировом сообществе Data Science - Kaggle и многом другом в выступлениях Григория Бакунова (Yandex ), Дмитрия Новицкого (Rybka Project), Александра Шкопа (Envion Software) и др. Value Management and Business Analysis (обмен реальным практическим опытом работы бизнес аналитика на IT проектах разного рода. Как эффективнее описывать требования к системе? Ответ на вопрос: какие методы выявления скрытых требований к продукту могут быть? Как создавать действительно ценные продукты с точки зрения бизнеса? Самое важное о новых тенденциях с сфере БА и ВМ от специалистов из Украины, России, Молдовы, Эстонии, Белоруси – Ольги Павловой (SobakaPavlova), Артема Сердюка (EffectCup, ScrumGuides), Александра Белина (EPAM Systems), Юрия Веденина (ITMINE) и др. IT Outsourcing (об ІТ индустрии во Львове, как приоритете стратегического развития, актуальном состоянии и перспективах развития индустрии во Львове и Украине, влиянии перемен в стране на развитие индустрии информационных технологий, взаимодействии и сотрудничестве аутсорсинговых компаний со стартап-проектами и многом другом расскажут Андрей Садовый (Lviv City Council), Андрей Ганкевич (Lviv IT-BPO Cluster), Тарас Кицмей (SoftServe), Андрей Павлив (N-iX), Theo Schnitfink (Symphony Solutions), Alan Harlan (SoftServe), Алексей Скрыпник (Eleks), Степан Веселовский (Lviv IT-BPO Cluster) и др. Information Security (вопрос информационной безопасности на государственном уровне, практические аспекты информационной безопасности, безопасность электронной почты и многое другое в докладах Николая Коваля (CERT-UA), Евгения Преображенского (URAN), Павла Хромчака (WISC UA community) Management as fun (о TBD и темной стороне ІТ менеджмента в теоретическом и практическом аспекте, геймификации в пост-тренингах, коучинг подходе и другом в докладах  Анны Подгорной, Наталии Шпот (Lviv PM school), Андрея Яворского (GlobalLogic), Софии Опацкой (LvBS ) и др. Game Development (в потоке GameDev - почему Unity скоро захватит мир, о проблемах, которые возникают при разработке больших игровых проектов, о лучших практиках построения интерфейсов и успешной истории проекта Nravo Kids расскажут эксперты – Сергей Гринец (Nravo), Ростислав Каминский (Nravo), Тарас Леськив (Nravo), Андрей Вышковский (Nravo) и другие) Главный организатор конференции — Львівський кластер інформаційних технологій та бізнес-послуг. Соорганизаторы – компания Eleks, Львівська спільнота тестувальників, Львівська бізнес-школа, Спільнота розробників Google (GDG), Бізнес-інкубатор Startup Depot, Спільнота спеціалістів у сфері інформаційної безпеки (WISC), Школа проектного менеджменту і Львівська міська рада (ЛМР). Генеральный партнер – SoftServe, Turkish Airlines, Tesla Золотые партнеры – Samsung Electronics Ukraine Company, ПАТ «Укртелеком», Data Art, Оптима Плаза, Noosphere Серебряные партнеры – Qubstudio, GlobalLogic, DalivSoft Inc, Квитковий сервіс Gastroli.UA, Місцевий економічний розвиток, ELMOB.CO, Інтергал-Буд, NATEK Poland Гостеприимные партнеры – Leopolis, Citadell Inn, Nota Bene, Панська гора Генеральный медиапартнер –  DOU Эксклюзивный медиапартнер – Радіо 24 та Телеканал новин 24 Главный деловой медиапартнер – Delo.ua Медиапартнеры: IT Expert, INVenture, Brainberry Global, dev.by, it.rabota.ua, Betaplace, GTF, Geeks Lab, Highload Dev Conf, AgileBaseCamp, IT Ukraine, WannaBiz, Bitcoin Conference Kiev, Brain Basket Foundation, ITVDN, ITEM, PM Forum, Spider Ukraine, IT Rally, IT Weekend, Львівська газета, Postpaper, Электронный документооборот и ИТ для бизнеса, Lviv Online, ERVE.ua, Сайт міста Рівне 0362, Career4it.
Як створити веб-сайт за допомогою AJAX

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

Создания простого чата Для начала создадим простой чат с помощью HTML&CSS и PHP&MySQL Проектирование Базы Данных Переходим к phpMyAdmin. Создаем новую базу данных, называем “chatdb”. Создаем новую таблицу, называя “Posts”, включая в себя 4 столбца: “id” тип колонки INT, автоматическое увеличение на 1 (задаем A_I в ячейку с флажком) основной ключ (index); “nick” тип колонки VARCHAR и длина 100; “post_text” тип колонки TEXT; “post_dt” тип колонки DATETIME по умолчанию является CURRENT_TIMESTAMP. Создание веб-сайта. Во-первых, создадим главную страницу. Список комментариев и отправка формы, используя кнопку. Всё будет находится в файле “index.php” .  Давайте создадим этот файл и напишем что-то вроде этого:  <html> <head> head> <body> php $mysqli = new mysqli("127.0.0.1", "root", "", "chatdb"); /* "127.0.0.1" is MySQL host name. In local servers (XAMPP, Ampps, etc.) it is 127.0.0.1. If you using a dedicated hosting, see it in admin panel. */ /* "root" and "" is login and password for DB's user. In local servers usually default DB user is "root" with empty password. */ /* "chatdb" is DB's name. */ /* Warning: in XAMPP you should manually run MySQL server (from xampp-control.exe) to get it work. */ $result = $mysqli->query("SELECT * FROM posts;"); ?> <style> /* All CSS is very simplified. I provide it for example and no more.  * In Chrome it works tolerably, but in IE and Firefox it works very poorly.  */ .content {   display: table;   width: 50%;   min-width: 400px;   height: 80%;   /* Center horizontally and vertically */   position: absolute;   left: 0; right: 0;   top: 0; bottom: 0;   margin: auto;   /* Design */   border: 1px solid;   background-color: silver;   padding: 5px; } /* For mobile devices */ @media (max-width: 400px) {   .content {     width: 100%;     min-width: 0;     padding: 0px;   } } style> <div class="content"> <div id="comments" style="overflow-y: scroll; height: 100%;"> php if ($result) {   while ($post = $result->fetch_object()){     $nick = $post->nick;     $post_dt = $post->post_dt;     $post_text = $post->post_text;         echo "<b>$nickb> ($post_dt):<br>";     echo "$post_text<br>";     echo "<br>";   }   $result->close(); } ?> div> php $mysqli->close(); ?> <form action="post.php" method="post" style="height: 0; display: table-row;">   Nick:<br>   <input type="text" name="nick" style="width: 100%;">input><br>   <br>   Text:<br>   <textarea name="text" style="width: 100%;">textarea><br>   <br>   <input type="submit">input> form> div> <script type="text/javascript">     var divComments = document.getElementById('comments');     divComments.scrollTop = divComments.scrollHeight; script> body> html> 2. Дальше давайте создадим “post.php” файл и напишем такое:  php $nick = $_POST['nick']; $post_text = $_POST['text']; $mysqli = new mysqli("127.0.0.1", "root", "", "chatdb"); $nick = $mysqli->real_escape_string($nick); $nick = htmlspecialchars($nick); $post_text = $mysqli->real_escape_string($post_text); $post_text = htmlspecialchars($post_text); $mysqli->query("INSERT INTO posts (nick, post_text) VALUES ('$nick', '$post_text');"); $mysqli->close(); /* Redirect To Main Page */ header('Location: ' . $_SERVER['HTTP_REFERER']); ?> 3. Откроем ваш чат в любом продвинутом браузере. Вся работа:  4. Напишите ник и текст, а потом нажмите на кнопку отправки.  Когда отправили форму, сразу же происходит перенаправление формы главной страницы в “post.php”. “Post.php” моментально наполняет данными таблицу и перенаправляет на главную страницу. Также “post.php” содержит начальный XSS и SQL защищенный вход. Для упрощения не отправляем клиентам время с JS на “post_dt” на внесения данных, а указываем значение по умолчанию – CURRENT_TIMESTAMP, который предоставляет нынешнюю дату и время на сервер. Когда количество комментариев больше, чем экран может вместить, то комментарии   переполнены в div, используется вертикальный скроллбар. Во время загрузки страницы JS автоматически опускает скроллбар вниз к недавнему комментарию. Что тут не так? Проблема номер 1. Новый непрочитанный комментарий от пользователя не загружается в базу данных автоматически, без ручной перезагрузки страницы. Это очень, очень серьезная проблема для любого чата. Как это исправить? Очевидно, один из путей сделать это - использовать HTTP-запрос к фоновой работе автоматически (с помощью JS) и асинхронно, то есть это один из способов обеспечить выполнение AJAX в любой form. Проблема номер 2. Также неправильно то, что кнопка отправки перезагружает страницу (перенаправляет на вторую страницу и следующим шагом возвращает назад). При перезагрузке страницы сбрасывает “Nick” в  поле (также, как любые другие изменения, те, что сделали с пользователем) Как это исправить? Конечно, можно обеспечить выполнение обхода для сохранения изменений и перезагрузки на перезагружаемой странице. Но не эффективнее ли устранить причину, чем последствие? Можно только убрать перезагружаемую страницу и эта проблема будет решена автоматически. Проблема номер 2.1. Видите ли что-то необычное тут? Это слишком быстро? Дело с чатом очень простое – загружаем только два маленьких текстовых параметра. Что делать, если нужно улучшить чат с помощью добавления присоединения, а конкретно - изображений и видео? Видео может иметь объем в размере нескольких мегабайт, что тогда в этом случае? Давайте попробуем.  Давайте немного изменим “post.php”, после $mysql->query() добавив это:  for ($i = 0; $i < 1000000000; $i++) { } Старайтесь размещать какие-либо комментарии. Что мы видим? Нет, UI не остановилось (заморозилось), но браузер ждет до того, как закончится подключение:   Да, если “post.php” вызывает какую-то необработанную ошибку, то чат исчезает, и пользователь видит пустое окно с сообщением о непонятной ошибке. Чтобы вернуться к чату, пользователю стоит нажать кнопку “Back” в браузере. И это проблема номер 2.2. Давайте уберем петлю с “post.php” и исправим эти проблемы. Реализация легкого AJAX в простой чат Автоматическое обновление комментариев Эта веб-страница без AJAX? Это веб-страница, которая полностью перезагружается. Эта веб-страница c AJAX? Это веб-страница, что перезагружается частично. Где же взять части этих страниц? Стоит разделить нашу страницу на части, в этом случае сервер генерирует страницу частично. Страница будет состоять из двух частей – блок комментариев и другой контент страницы. Комментарии будут загружаться и перезагружаться отдельно от другой страницы. Давайте сделаем первую часть, то есть блок комментариев. Для начала создадим пустой файл, назовем “getcomment.php”. Дальше переходим в “index.php” для того, чтобы вырезать комментарии и далее отделить его. 1. Вырезаем инициализированный блок MySQL с “index.php"  php $mysqli = new mysqli("127.0.0.1", "root", "", "chatdb"); /* "127.0.0.1" is MySQL host name. In local servers (XAMPP, Ampps, etc.) it is 127.0.0.1. If you using a dedicated hosting, see it in admin panel. */ /* "root" and "" is login and password for DB's user. In local servers usually default DB user is "root" with empty password. */ /* "chatdb" is DB's name. */ /* Warning: in XAMPP you should manually run MySQL server (from xampp-control.exe) to get it work. */ $result = $mysqli->query("SELECT * FROM posts;"); ?> вставляем в “getcomments.php”. 2. Следующее, вырежем контент div c комментариями с “index.php”: php if ($result) {   while ($post = $result->fetch_object()){     $nick = $post->nick;     $post_dt = $post->post_dt;     $post_text = $post->post_text;         echo "<b>$nickb> ($post_dt):<br>";     echo "$post_text<br>";     echo "<br>";   }   $result->close(); } ?> И вставим (добавим) в “getcomments.php” после инициализации MySQL. 3. Дальше, вырежем недалекий блок MySQL с “index.php”: php $mysqli->close(); ?> Вставим его в конец файла “getcomments.php”. 4. Наконец-то, убираем JS-скрипт, который опускает скролл в самый низ. <script type="text/javascript"> var comments = document.getElementById('comments'); comments.scrollTop = comments.scrollHeight; script> Не переживай, это только временно. 5. Сделано. Теперь имеем что-то наподобие этого:  <html> <head> head> <body> <style> /* All CSS is very simplified. I provide it for example and no more.  * In Chrome it works tolerably, but in IE and Firefox it works very poorly.  */ .content {   display: table;   width: 50%;   min-width: 400px;   height: 80%;   /* Center horizontally and vertically */   position: absolute;   left: 0; right: 0;   top: 0; bottom: 0;   margin: auto;   /* Design */   border: 1px solid;   background-color: silver;   padding: 5px; } /* For mobile devices */ @media (max-width: 400px) {   .content {     width: 100%;     min-width: 0;     padding: 0px;   } } style> <div class="content"> <div id="comments" style="overflow-y: scroll; height: 100%;"> div> <form action="post.php" method="post" style="height: 0; display: table-row;">   Nick:<br>   <input type="text" name="nick" style="width: 100%;">input><br>   <br>   Text:<br>   <textarea name="text" style="width: 100%;">textarea><br>   <br>   <input value="Submit" type="submit">input> form> div> body> html> getcomments.php:  php $mysqli = new mysqli("127.0.0.1", "root", "", "chatdb"); /* "127.0.0.1" is MySQL host name. In local servers (XAMPP, Ampps, etc.) it is 127.0.0.1. If you using a dedicated hosting, see it in admin panel. */ /* "root" and "" is login and password for DB's user. In local servers usually default DB user is "root" with empty password. */ /* "chatdb" is DB's name. */ /* Warning: in XAMPP you should manually run MySQL server (from xampp-control.exe) to get it work. */ $result = $mysqli->query("SELECT * FROM posts;"); ?> Вероятно, теперь наша страница разделена. Давайте проверим её. Переходим http (точнее ССЫЛКА для локального сервера). Дальше, переходим на главную страницу, http:///index.php Это удивительно! Всё удачно получилось, разделив страницу на части за пару минут! Не останавливаемся на этом. Теперь “glue” эти части с помощью AJAX. Как это сделать? 1. Для начала стоит создать пустой JS-скрипт на главной странице: <script type="text/javascript"> alert('Test'); script> Добавив это после тега div, перед закрывающимся тегом . 2. Сделаем HTTP GET запрос от JS к “getcommet.php” Для этого используем XMLHtttpRequest (XHR) класс: <script type="text/javascript"> var xhr = new XMLHttpRequest(); xhr.open('GET', '/getcomments.php', false); xhr.send(null); if (xhr.status == 200) {   alert(xhr.responseText); } script> Это работает, но не читает старые версии IE те, что не поддерживают такую инициализацию. Для получения более кросс-браузерного пути переходим в и добавляем это: <script type="text/javascript"> function getXmlHttp(){   var xmlhttp;   try {     xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");   } catch (e) {     try {       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");     } catch (E) {       xmlhttp = false;     }   }   if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {     xmlhttp = new XMLHttpRequest();   }   return xmlhttp; }; script> И главный скрипт (в конце) <script type="text/javascript"> var xhr = getXmlHttp(); xhr.open('GET', '/getcomments.php', false); xhr.send(null); if (xhr.status == 200) {   alert(xhr.responseText); } script> Как видно, теперь JS получает контент со страницы “getcomments.php” и показывает это в предупреждении.   2.1. Вопрос: «Это на самом деле AJAX (Asynchronous Javascript And Xml)?» Это AJAX, потому что запрос сервера отформатирован в HTML (который основан на XML). Но действительно ли это AJAX, это асинхронно? Проверим. Добавим эти уже знакомые строки в любое место между в “getcomments.php”: for ($i = 0; $i < 1000000000; $i++) { } Что теперь видно на загружаемой странице? Вначале страница зависает, его замораживает UI (становится не реагирующим на нажатие левой/правой кнопки мыши): Дальше Chrome показывает навязчивое всплывающие окно, сообщающее об удалении страницы: Это не AJAX! Это JAX! Как его сделать асинхронным? К счастью, ХHR также поддерживает асинхронный режим: <script type="text/javascript"> var xhr = getXmlHttp(); xhr.open('GET', '/getcomments.php', true); /* true for asynchronous */ xhr.onreadystatechange = function() {   if (xhr.readyState == 4) {     if(xhr.status == 200) {       alert(xhr.responseText);     }   } }; xhr.send(null); script> В этом случае браузер не ждет ответа с главного потока пользовательского интерфейса, он запускает в другом (асинхронно) и вызываемым событием “onreadystatechange” в главном контексте UI.  Теперь всё в порядке, страница полностью доступна, пока запрос запущен, и после ответа получит предупреждение. for ($i = 0; $i < 1000000000; $i++) { } И продолжаем работу. 3. Добавляем этот контент в div  вместо предупреждения. Заменить это: alert(xhr.responseText);  C этим: var divComments = document.getElementById('comments'); divComments.innerHTML = xhr.responseText; Возвращаем назад, клиент видит “glued” страницу с блоком комментариев. 4. Дальше следует установить интервал для автоматической проверки новых комментариев время от времени… и также восстановить удаленный сценарий автоматической прокрутки.  <html> <head> <script type="text/javascript">     function getXmlHttp() {         var xmlhttp;         try {             xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");         } catch (e) {             try {                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");             } catch (E) {                 xmlhttp = false;             }         }         if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {             xmlhttp = new XMLHttpRequest();         }         return xmlhttp;     }; script> head> <body> <style> /* All CSS is very simplified. I provide it for example and no more.  * In Chrome it works tolerably, but in IE and Firefox it works very poorly.  */ .content {   display: table;   width: 50%;   min-width: 400px;   height: 80%;   /* Center horizontally and vertically */   position: absolute;   left: 0; right: 0;   top: 0; bottom: 0;   margin: auto;   /* Design */   border: 1px solid;   background-color: silver;   padding: 5px; } /* For mobile devices */ @media (max-width: 400px) {   .content {     width: 100%;     min-width: 0;     padding: 0px;   } } style> <div class="content"> <div id="comments" style="overflow-y: scroll; height: 100%;"> div> <form action="post.php" method="post" style="height: 0; display: table-row;">   Nick:<br>   <input type="text" name="nick" style="width: 100%;">input><br>   <br>   Text:<br>   <textarea name="text" style="width: 100%;">textarea><br>   <br>   <input value="Submit" type="submit">input> form> div> <script type="text/javascript">     var divComments = document.getElementById('comments');     function loadComments() {         var xhr = getXmlHttp();         xhr.open('GET', '/getcomments.php', true);         xhr.onreadystatechange = function () {             if (xhr.readyState == 4) {                 if (xhr.status == 200) {                     if (xhr.responseText !== divComments.innerHTML) {                         divComments.innerHTML = xhr.responseText;                         divComments.scrollTop = divComments.scrollHeight;                     }                 }             }         };         xhr.send(null);     };     loadComments();     setInterval(loadComments, 1000) script> body> html> Теперь проблема исправить это. Новые комментарии с другого пользовательского чата (другие вкладки браузеров, окон и экземпляров) получают каждые 1000 миллисекунды (1 секунду) автоматически. Но отправка комментариев уже вызывает перезагрузку нашей страницы. Отправка комментариев без перезагрузки Как написано выше, XHR помогает отправлять HTTP GET-запросы без перезагрузки страницы и GUI заморозки (асинхронно). Теперь отправляем HTTP-запрос асинхронно, но на этот раз POST запрос, а не GET. И, естественно, XHR позволяет это. Используем метод send(). Для GET указываем null. Для POST устанавливаем запрос “body”.Также нужно добавить “Content-Type:application/x-www-from-urlencoded” в header  для того, чтобы разрешить серверу знать, какой формат использовать для отправки данных. Заметка: если не знаете, что отправлять, то можно захватить регулярный запрос с помощью “Fiddler” или же любой другой HTTP-перехватчик и только просимулировать запрос. HTTP-перехватчик — это незаменимый инструмент для работы с HTTP/HTTPS. Это позволяет увидеть все headers и bodies по всем HTTP(S)-запросам, что отправляются в систему. Лучше использовать “Fiddler”, это бесплатное, современное и очень простое приложение, что может поддерживать HTTP/HTTPS и оба Win x86/x64. 1. Для начала создадим пустой JS скрипт в HTML. Разместить до самого тега, потому что этот скрипт будет использован для отправки формы комментария (форма будет вызывать этот скрипт при отправке).2. В этом скрипте, реализуем функцию, что будет отправлять ник и комментарии в “post.php”  <script type="text/javascript"> function postComment(nick, text) {   var xhr = getXmlHttp();   xhr.open('POST', '/post.php', true);   xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');   xhr.onreadystatechange = function() {     if (xhr.readyState == 4) {       if (xhr.status == 200) {         /* it isn't required to add comment to DOM manually, it will done automatically on next refresh via AJAX */       }     }   };   xhr.send('nick=' + nick + '&text=' + text); /* joining the data in format simulates form */ }; script> 3. Следующие, перезагружая страницу при отправке:  ... onsubmit="return false;"> Также добавим вызов “postComment’s”: action="post.php" method="post" style="height: 0; display: table-row;" onsubmit="postComment(this.nick.value, this.text.value); return false;"> 4. Наконец, необязательно, но можно убрать “action” и “method” с формы:  <form style="height: 0; display: table-row;" onsubmit="postComment(this.nick.value, this.text.value); return false;"> 5. Результат: <html> <head> <script type="text/javascript">     function getXmlHttp() {         var xmlhttp;         try {             xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");         } catch (e) {             try {                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");             } catch (E) {                 xmlhttp = false;             }         }         if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {             xmlhttp = new XMLHttpRequest();         }         return xmlhttp;     }; script> head> <body> <style> /* All CSS is very simplified. I provide it for example and no more.  * In Chrome it works tolerably, but in IE and Firefox it works very poorly.  */ .content {   display: table;   width: 50%;   min-width: 400px;   height: 80%;   /* Center horizontally and vertically */   position: absolute;   left: 0; right: 0;   top: 0; bottom: 0;   margin: auto;   /* Design */   border: 1px solid;   background-color: silver;   padding: 5px; } /* For mobile devices */ @media (max-width: 400px) {   .content {     width: 100%;     min-width: 0;     padding: 0px;   } } style> <div class="content"> <div id="comments" style="overflow-y: scroll; height: 100%;"> div> <script type="text/javascript">     function postComment(nick, text) {         var xhr = getXmlHttp();         xhr.open('POST', '/post.php', true);         xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');         xhr.onreadystatechange = function () {             if (xhr.readyState == 4) {                 if (xhr.status == 200) {                     /* it isn't required to add comment to DOM manually, it will done automatically on next refresh via AJAX */                 }             }         };         xhr.send('nick=' + nick + '&text=' + text);     }; script> <form style="height: 0; display: table-row;" onsubmit="postComment(this.nick.value, this.text.value); return false;">   Nick:<br>   <input type="text" name="nick" style="width: 100%;">input><br>   <br>   Text:<br>   <textarea name="text" style="width: 100%;">textarea><br>   <br>   <input value="Submit" type="submit">input> form> div> <script type="text/javascript">     var divComments = document.getElementById('comments');     function loadComments() {         var xhr = getXmlHttp();         xhr.open('GET', '/getcomments.php', true);         xhr.onreadystatechange = function () {             if (xhr.readyState == 4) {                 if (xhr.status == 200) {                     if (xhr.responseText !== divComments.innerHTML) {                         divComments.innerHTML = xhr.responseText;                         divComments.scrollTop = divComments.scrollHeight;                     }                 }             }         };         xhr.send(null);     };     loadComments();     setInterval(loadComments, 1000) script> body> html>  Теперь простая реализация AJAX подошла к концу. Это ещё не конец, это только начало. Есть ещё достаточно всего для изучения и улучшения.
Міжнародний фестиваль інноваційних проектів Pioneers Kyiv!

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

ITVDN выступает региональным спонсором фестиваля инновационных проектов Pioneers Kyiv! Международный фестиваль инновационных проектов Pioneers в этом году впервые пройдет а Украине. Организатором мероприятия PioneersKyiv стала компания Eltrino.С 2012 года Pioneers Festival собирает вместе в Вене лучшие стартапы и инвесторов, которые хотят внести свой вклад в развитие будущих технологий и прорывных идей. Все это происходит при поддержке значительного количества медиа ресурсов, которые имеют прекрасную возможность первыми узнать и осветить в своих изданиях проекты новейших технологий или просто интересные стартапы, которые могут в корне изменить наш мир уже завтра. Ежегодно более 1600 стартапов с более чем 90 стран мира могут встретиться в Вене с 400 инвесторами. Количество посетителей ограничивается 2500 участниками, поэтому регистрация желающих происходит заблаговременно. Сама компания Pioneers основана в 2010 году. В своем арсенале имеют ряд проектов, которые способствуют развитию и росту инновационных проектов, и созданию целостной функциональной экосистемы вокруг стартапов по всему миру, а именно: Pioneers Festival. Global Pioneers - это более 30 ивентов сообщества в разных уголках мира (Токио, Париж, Будапешт, Турин, Амстердам, Сингапур и др. В этом году к перечню присоединяется еще и Киев). Площадка, где предприниматели могут найти новые полезные знакомства, показать свои проекты широкой общественности, помочь росту своего бизнеса. Происходит дважды в год в каждом регионе. Global Pioneers объединяет местные предпринимательские организации в единое глобальное сообщество. PioneersKyiv является частью экосистемы для стартапов. Pioneers Discover - консультационная поддержка стартапов и компаний. Pioneers Ventures - инвестиционное подразделение, которое помогает привлечь инвестиции на этапах early stage и pre-seed. Pioneers Challenge - соревнования стартап проектов. Так что, теперь в украинских проектов появилась еще одна возможность для привлечения инвестиций, получения эффективных советов и рекомендаций, как сделать свой стартап действительно успешным, заявить о себе широкой общественности, найти потенциальных клиентов и новые полезные контакты. Главная цель PioneersKyiv - найти новые инновационные проекты, помочь им привлечь инвесторов. В рамках ивента состоится конкурс для стартапов, победитель, которого получает билет на следующий фестиваль Pioneers в Вене. Желающим принять участие в конкурсе необходимо: подать заявку через регистрационную форму на сайте до 5 июня включительно, с 5 по 12 июня среди представленных стартапов будет избран 8 лучших, 12 июня до 20.00 стартапы получают уведомления о результатах отбора, отобранные стартапы готовятся к выступлению, финальная версия презентации должно быть подано до 26 июня, 27 июня с 10.00 до 13.30 - репетиция питчей в М17 27 июня отобранные стартапы выходят на питч (3 минутный доклад) на PioneersKyiv, их презентации оценивают судьи. счастливый победитель получает билет на Pioneers Festival в Вене. Судейская коллегия PioneersKyiv: Наталья Березовская - председатель совета правления UAngel, генеральный директор и управляющий партнер Detonate Ventures. Михаил Рябоконь - главный управляющий директор Noosphere Ventures Андрей Колодюк - управляющий партнер AVentures Capital, автор и основатель Divan.tv Вадим Т. Роговский - член совета правления UAngel, генеральный директор WannaBiz, соучредитель маркетингового агентства Face2Face Media Игорь Шойфот - член совета правления Happy Farm, предприниматель, инвестор, основатель Fotki.com Андрей Криворчук - управляющий партнер и исполнительный директор Chernovetskyi Investment Group Наши спикеры вдохновляют. 27-го июня участники и гости PioneersKyiv имеют возможность услышать полезные практические доклады: Марк Туррел - основатель и управляющий директор Orcasci, основатель “AIA” Conference, номинант Pioneer Technology на Всемирном экономическом форуме в 2008 году и Young Global Leader в 2010, автор “Scaling: Small Smart Moves For Outsized Results”. Тема доклада "50 Shades of Scaling: What tech companies can learn from the fastest selling book on the planet" (50 оттенков измерений: Какой опыт могут извлечь технологические компании из успеха самой продаваемой книги на планете). Михаил Рябоконь - главный управляющий директор Noosphere Ventures. Расскажет об инвестиционной политике Noosphere и даст рекомендации как заручиться поддержкой Noosphere Ventures. Наталья Березовская - председатель совета правления UAngel, генеральный директор и управляющий партнер Detonate Ventures. Расскажет об увеличении возможностей и снижения рисков для стартапов благодаря нетворку бизнес ангелов UAngel. Дмитрий Гадомский - партнер адвокатского объединения "Юскутум" Юрист-ботан, партнер юридической фирмы Юскутум. Раскроет секрет как узнать, что вы нарушаете закон. Кирилл Соляр - генеральный директор Sponge Digital & design, продакт менеджер в looks.fm. Эксперт по диджитал маркетингу, управления стартапами в ИТ. Все проекты, которые не пройдут отбор, имеют возможность принять участие в двухчасовом шоукейсе, где могут рассказать о своем проекте инвесторам и другим стартапам, услышать советы, рекомендации. С нетерпением ждем 27-го июня, чтобы показать замечательные проекты, услышать интересные доклады и получить море вдохновения. Начало регистрации в 14.00 в Центре современного искусства "M17" (ул. Антоновича, 102-104). Спешите приобрести билеты со скидкой 10%!  P.S. Секретная информация - только у ITVDN есть специальные скидочные коды на билеты на PioneersKyiv, обращайтесь.
Notification success