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

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

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

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

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

Результати пошуку за запитом: видеокурс c*
Framework у С# для перевірки відбитків пальців

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

Введение В наше время распознавание отпечатков пальцев является активным направлением исследований. Важным компонентом в системе распознавания отпечатков является алгоритм. В связи с проблемой данной сферы алгоритмы распознавания отпечатков пальцев делятся на две категории: алгоритмы проверки и идентификации. Цель алгоритмов проверки отпечатков пальцев является – определить, какой из двух отпечатков сделан одним пальцем, а какой нет. С другой стороны, алгоритмы идентификации делают поиск запроса отпечатка пальца в базе данных, ища отпечаток, сделанный одним и тем же пальцем. Насколько мы знаем, существуют сотни документов, касающихся проверки отпечатков пальцев, но нет ни одного фреймворка, позволяющего проверять отпечатки в сети. Поэтому вы должны осуществлять ваши личные настройки, тестировать выполнения алгоритмов распознавания ваших отпечатков. Более того, вы должны потратить много времени, выполняя алгоритмы других авторов, для сравнения с собственными. FVC-onGoing – наиболее связанный с работой нашего фреймворка в веб-системе. Данная система имеет такие ограничения: У вас нет доступа к другим алгоритмам, кроме своих. Это не фреймворк, поэтому вы не можете использовать другие компоненты программного обеспечения. Система не может быть использована с целью обучения, так как ученик не может посмотреть, как работают алгоритмы. После выполнения опыта используется база данных (стандартная или жесткая), вам необходимо ждать 30 дней для, того чтобы сделать следующий эксперимент, используя ту же базу данных. Вы не можете управлять базой данных. Таким образом, вы не можете использовать собственную базу данных либо редактировать существующую. Отсутствует доступ к тем отпечаткам, для которых ваш алгоритм не выполнился. Следовательно, вы не сможете проанализировать, почему ваш алгоритм не выполнился для того, чтобы исправить код. Вы не сможете создать эксперимент с помощью обычного протокола, для оценки выполнения Если в любом из указанных выше ограничениях для вас возникли проблемы, тогда используйте наш фреймворк. Наш фреймворк реализован на С# с использованием .Net Framework по двум главным причинам. Во-первых, С# стал одним из самых популярных языков программирования. Вторая причина в том, что инструменты, библиотеки и классы, доступные в .Net Framework, экономят много времени написания кода. Наш фреймворк позволяет экспериментировать в базах данных типа B от FVC2000, FVC2002 и FVC2004, и в базах данных типа А от FVC2002 и FVC2004. В этих экспериментах мы выполняем индикаторы the Fingerprint Verification Competitions (EER(%), FMR100(%), FMR1000(%), ZeroFMR(%), Time(ms) и ROC curves).  Кроме того, вы можете делать опыты даже с обычным протоколом и разными базами данных. Мы реализовали алгоритмы распознавания отпечатков пальцев, предложенный Tico и Kuosmanen, Jiang и Yau, Medina-Pérez и Qi. Важно обратить внимание на то, что вопреки алгоритму Qi - это набор шаблонов отпечатков пальцев, основывающийся на алгоритмах, мы реализовали только алгоритмы, сопоставимые протоколами ввода отпечатка пальца. Мы также сделали алгоритмы выделения признаков, предложенный Ratha, и ориентацию на получение изображения предложенную Sherlock. Данный фреймворк позволяет вам добавлять, как новые алгоритмы распознавания отпечатков, так и новые алгоритмы выделения признаков с минимальными усилиями и без перекомпиляции фреймворка. Одна из целей, которую мы преследовали, когда разрабатывали данный фреймворк, была сделать классы интерфейсов простыми и доступными. Таким образом, процесс добавления новых алгоритмов очень прост. В этой статье мы вкратце объясняем, как: экспериментировать над распознаванием отпечатков пальцев; увидеть шаблон отпечатка пальца после выполнения алгоритма; высчитать и вывести на дисплей отпечаток пальца; интегрировать ваши алгоритмы в фреймворк. Расширения данного фреймворка с целью исследований появились в https://sites.google.com/site/miguelmedinaperez/software/fprframework В данной статьей мы вкладываем следующие файлы: FingerprintRecognition_v2.2.zip: исходные файлы нашего фреймворка. Help.zip: Исходный код документации. Запуск исследования для распознавания отпечатков пальцев Извлеките файл “FingerprintRecognition.zip” и постройте решение. Далее вы можете отлаживать проект “FR.FVCExperimenter” или можете запустить “FR.FVCExperimenter.exe” в директорию, которая содержит сгенерированный узел. Данное окно откроет: В строке “Resources” записан путь к базе данных, которую вы собираетесь использовать, к примеру: “D:\PR Databases\Fingerprints\FVC2004\DB1_B”. Выберите подходящий вам тип опыта в всплывающем меню с названием “Experiment”. Используйте меню с названиями “Minutia Extractor”, “Orientation Image Extractor” и “Skeleton Image Extractor“ для выбора алгоритма, который будет использоваться для нахождения основных особенностей (отпечаток, ориентированное изображение и его образ). Используйте поле “Matcher” для выбора алгоритма распознавания отпечатков пальцев и поле “Feature Provider” для выбора алгоритма, который будет хранить и извлекать черты выбранных совпадений. Несмотря на то, что мы реализовали только одну черту распознавания для каждого совпадения, существуют сценарии, где вы используете несколько признаков для одного совпадения. Поле с названием “Properties” позволяет изменять параметры выбранного алгоритма. Кликните на кнопку “Execute Experiment” для запуска исследования. Данный опыт использует протокол оценки от the Fingerprint Verification Competitions. В этом опыте мы высчитали такие индикаторы: EER(%), FMR100(%), FMR1000(%), ZeroFMR(%), Время(мс) и  ROC-кривая. Эти индикаторы сохранены в файле с именем, сформированным в зависимости от выбранного вами алгоритма и окончанием ".Summary.csv". Этот файл сохраняется в папке с названием "Results" в той же папке, где хранятся отпечатки пальцев. Также сохранены еще два файла, один хранит в себе ложные соответствия отпечатков пальцев, другой – ложные несоответствия отпечатков. Если вы хотите сравнить 2 отпечатка и проверить их совпадение, кликните на кнопку “Visual Match”, после которой откроется форма “Visual Fingerprint Matching”. Загрузите отпечатки, которые вы хотите сравнить и нажмите кнопку “Match”. Экстрактор признаков и выбранный в “FVC Experimenter” режим также здесь используются для того, чтобы выполнить сравнение отпечатков пальцев. Ниже пример сравнения двух отпечатков. Визуализация очертаний отпечатка пальца Если вы хотите вывести картинку очертания отпечатка, тогда вам нужно использовать проект “FR.FeatureDisplay”. В поле “Fingerprint Feature Display” вы можете изменять экстрактор признаков и их изображение. В фреймворке мы используем классы для визуализации отпечатка, ориентированное изображение и скелет картинки. В следующем примере вы можете увидеть визуализацию приблизительного изображения отпечатка: Соответствие отпечатков вне фреймворка В данном разделе представлен пример использования фреймворка для сравнения двух изображений отпечатков в обычном пользовательском приложении. Он складывается из 3 шагов для сравнения 2 изображений отпечатков: загрузить картинку, извлечение признаков и их сравнение. В этом случае пользователям нужно добавить ссылки из их приложения к сборке FR.Core и FR.Medina2012. Сборки SHullDelaunayTriangulation и ImageProcessingTools должны быть добавлены в папку вывода, где появится бинарный файл. // Loading fingerprints var fingerprintImg1 = ImageLoader.LoadImage(fileName1); var fingerprintImg2 = ImageLoader.LoadImage(fileName2); // Building feature extractor and extracting features var featExtractor = new MTripletsExtractor() { MtiaExtractor = new Ratha1995MinutiaeExtractor() }; var features1 = featExtractor.ExtractFeatures(fingerprintImg1); var features2 = featExtractor.ExtractFeatures(fingerprintImg2); // Building matcher and matching var matcher = new M3gl(); double similarity = matcher.Match(features1, features2); Пример использования M3gl  показывает, как легко использовать фреймворк, и как хорошо сложен и не требует пояснений код. Правила хорошего дизайна применены в фреймворке и дают возможность пользователю легко заменить или изменить любой компонент. Добавление новых алгоритмов в фреймворк Первое, что вы должны знать - это то, что вам не нужно модифицировать приложение фреймворка для распознавания собственных алгоритмов, потому что мы используем Рефлекцию, для того чтобы загрузить все динамические алгоритмы во время выполнения. Вы можете создать столько приложений, сколько хотите в директории, которая содержит фреймворк. Для каждого нового приложения зайдите в настройки и укажите путь вывода со значением “..\bin\Release\”. Для добавления новой функции определения вам нужно наследовать с базового класса FeatureExtractor и реализовать метод ExtractFeatures(Bitmap image). Например, предположим, что вы хотите создать функцию определения типа MyFeature, дальше вы можете реализовать класс по примеру:  public class MyFeatureExtractor : FeatureExtractor {     public override MyFeature ExtractFeatures(Bitmap image)     {         // Place here your code to extract features     } } В случае, если новая функция была построена на некоторых существующих, вы можете поступить следующим образом: public class MyFeatureExtractor : FeatureExtractor {     public FeatureExtractor<List> MtiaExtractor { set; get; }     public FeatureExtractor OrImgExtractor { set; get; }     public override MyFeature ExtractFeatures(Bitmap image)     {         try         {             var mtiae = MtiaExtractor.ExtractFeatures(image);             var orImg = OrImgExtractor.ExtractFeatures(image);             return ExtractFeatures(mtiae, orImg);         }         catch (Exception e)         {             if (MtiaExtractor == null)                 throw new InvalidOperationException("Cannot extract MyFeature: Unassigned minutia list extractor!", e);             if (OrImgExtractor == null)                 throw new InvalidOperationException("Cannot extract MyFeature: Unassigned orientation image extractor!", e);             throw;         }     }     public MyFeature ExtractFeatures(List mtiae, OrientationImage orImg)     {         // Place here your code to extract features     } } Для каждой функции определения вы должны создать поставщик ресурса. Поставщик ресурса позволяет сохранять (полученный) в (выходной) файл ресурс, связанный с отпечатком. Фреймворк включает в себя поставщик ресурса для извлекания отпечатков (MinutiaListProvider), ориентированное изображение (OrientationImageProvider) и скелет картинки (SkeletonImageProvider). В следующем примере поставщика ресурсов для функции извлекания определены ниже. public class MyFeatureProvider : ResourceProvider {     public MinutiaListProvider MtiaListProvider { get; set; }     public OrientationImageProvider OrImgProvider { get; set; }     public override string GetSignature()     {         return "myf";     }     public override bool IsResourcePersistent()     {         return true;     }     protected override MyFeature Extract(string fingerprint, ResourceRepository repository)     {         try         {             var mtiae = MtiaListProvider.GetResource(fingerprint, repository);             var orImg = OrImgProvider.GetResource(fingerprint, repository);             return featureExtractor.ExtractFeatures(mtiae, orImg);         }         catch (Exception e)         {             if (MtiaListProvider == null)                 throw new InvalidOperationException("Unable to extract MyFeature: Unassigned minutia list provider!", e);             if (OrImgProvider == null)                 throw new InvalidOperationException("Unable to extract MyFeature: Unassigned orientation image provider!", e);             throw;         }     }     private MyFeatureExtractor featureExtractor = new MyFeatureExtractor(); } Пришло время создать новый алгоритм совпадения отпечатков пальцев. Предположим, вы хотите сравнить функции типа MyFeature, для этого вам необходимо создать «сравнитель» такой как: public class MyMatcher : Matcher {     public override double Match(MyFeature query, MyFeature template)     {         // Place here your code to match fingerprints     } } В случае, если вы реализовали алгоритм сравнения отпечатков, дальше вам необходимо изменить в коде ниже следующее: public class MyMatcher : Matcher, IMinutiaMatcher {     public override double Match(MyFeature query, MyFeature template)     {         List matchingMtiae;         return Match(query, template, out matchingMtiae);     }     public double Match(object query, object template, out List matchingMtiae)     {         // Place here your code to match fingerprints     } } Интегрированные встроенные алгоритмы в фреймворке Пользователям не нужно изменять фреймворк для интеграции обычных алгоритмов, так как Рефлекция загружает динамически, во время выполнения программы. В этом случае пользователи должны добавить новые алгоритмы к их собственным обычным сборкам. Для того, чтобы использовать существующие алгоритмы сравнения в фреймворке, первое, что необходимо сделать, создать поставщик ресурсов. Поставщик ресурсов позволяет сохранять (полученный) в (выходной) файл ресурсы, связанные с отпечатками пальцев. К примеру, предположим, что пользователи хотят интегрировать SourceAFIS SDK (http://www.sourceafis.org/) в фреймворк, следующая функция обеспечения может использоваться как: public class SourceAFISFeatureProvider : ResourceProvider {     protected override Person Extract(string fingerprint, ResourceRepository repository)     {         Fingerprint fp = new Fingerprint();         fp.AsBitmap = imageProvider.GetResource(fingerprint, repository);         Person person = new Person();         person.Fingerprints.Add(fp);         Afis.Extract(person);         return person;     }     public override string GetSignature()     {         return string.Format("sAFIS");     }     public override bool IsResourcePersistent()     {         return true;     }     private static AfisEngine Afis = new AfisEngine(); } А сейчас алгоритм сравнения отпечатков может быть записан в следующие классы: public class SourceAFISMatcher : Matcher {     public override double Match(Person query, Person template)     {         return Afis.Verify(query, template);     }     private static AfisEngine Afis = new AfisEngine(); } Результаты эксперимента Мы выполнили обширный эксперимент с алгоритмами сравнения отпечатков пальцев, пользуясь фреймворком. Выводы В данной статье продемонстрировали фреймворк в C# для распознавания отпечатков пальцев. Мы коротко объяснили, как выполнить опыты по распознаванию отпечатков и как интегрировать собственные алгоритмы в фреймворк. Мы предоставили несколько алгоритмов сравнения отпечатков пальцев и алгоритмов извлечения признаков, с помощью которых вы можете не только делать эксперименты, но и создать собственные приложения. Мы показали исходные коды всех алгоритмов, поэтому пользователь может использовать любую часть кода так же, как и любой компонент программного обеспечения. Источник: http://www.codeproject.com/Articles/97590/A-Framework-in-C-for-Fingerprint-Verification
Модуль Asyncio Python

Автор: Олексій Орленко

Введение Мы продолжаем цикл статей об асинхронном программировании с использованием сопрограмм в Python. В предыдущей статье мы рассмотрели реализацию сопрограмм при помощи генераторов в Python 2.5 и выше, в этой же познакомимся с той инфраструктурой, которая построена на основе них в Python 3. В Python 3.4 был включён модуль asyncio, который, на самом деле, был доступен в виде отдельного пакета на PyPI ещё для Python 3.3. Этот модуль предоставляет всю необходимую инфраструктуру для написания однопоточного конкурентного кода с использованием сопрограмм неблокирующего ввода-вывода, мультиплексирования ввода-вывода через сокеты и другие ресурсы, запуска сетевых клиентов и серверов и т.д. Его возможности: цикл событий с разными его реализациями, оптимизированными для различных операционных систем; абстракции «транспорта» и «протокола» (подобные тем, что используются в фреймворке Twisted); поддержка TCP, UDP, SSL, конвейеров UNIX-процессов, отложенных вызовов; адаптированный для использования с циклом событий класс Future, который представляет ещё не вычисленный результат асинхронной функции; сопрограммы и задачи, основанные на основе генераторов; поддержка отмены Future и сопрограмм; примитивы синхронизации для использования с сопрограммами; возможность запуска задач в пуле потоков либо пуле процессов, что позволяет даже взаимодействовать с библиотеками, которые совершают блокирующий ввод-вывод. В основе модуля asyncio лежит цикл событий (event loop). Он отвечает за: создание задач из сопрограмм и Future и их выполнение; регистрацию, исполнение и отмену отложенных вызовов; создание клиентских и серверных транспортов для различных видов коммуникации; запуск подпроцессов и связи их с транспортами для взаимодействия со внешним процессом; делегирование медленных вызовов обычных функций пулу потоков или пулу процессов. Сопрограммы в asyncio – это генераторы, которые отвечают определённым требованиям. Ко всем сопрограммам должен быть применён декоратор @asyncio.coroutine. Действия, которые поддерживают сопрограммы asyncio: result = yield from future – приостановка выполнения сопрограммы до получения future значения и присвоение этого значения переменной result (если future отменён, возникает исключение CancelledError); result = yield from coroutine – ожидание завершения работы другой сопрограммы и получение её результата; return result – возврат значения в сопрограмму, ожидающую данную; raise exception – выброс исключения для обработки его ожидающей сопрограммой (если оно не обработано в текущей). Рассмотрим пример двух сопрограмм, одна из которых вызывает другую, производящую какие-то затратные вычисления (на самом деле, для простоты примера она будет просто приостанавливать своё выполнение на одну секунду и возвращать квадрат числа). import asyncio @asyncio.coroutine def time_consuming_computation(x):     print('Computing {0} ** 2...'.format(x))     yield from asyncio.sleep(1)     return x ** 2 @asyncio.coroutine def process_data(x):     result = yield from time_consuming_computation(x)     print('{0} ** 2 = {1}'.format(x, result)) if __name__ == '__main__':     loop = asyncio.get_event_loop()     loop.run_until_complete(process_data(238))     loop.close() Функция get_event_loop модуля asyncio возвращает объект цикла событий, и мы используем его метод run_until_complete для запуска сопрограммы. Какое же в данном случае преимущество перед обыкновенными функциями? Во время работы сопрограммы asyncio.sleep выполнение программы не блокируется, и, если бы у нас были другие запланированные для выполнения задачи, они могли бы в это время выполняться в том же самом потоке. Несмотря на то, что данные сопрограммы выглядят как обычный последовательный код, на самом деле отдельные их части исполняются асинхронно. На схеме выше показано, в каком порядке исполняется код из примера. Можем переписать созданный ранее пример при помощи модуля asyncio. import asyncio import random import time @asyncio.coroutine def consume():     """Сопрограмма обработки данных"""     running_sum = 0     count = 0     while True:         data = yield from produce()         running_sum += data         count += 1         print('Got data: {}\nTotal count: {}\nAverage: {}\n'.format(             data, count, running_sum / count)) @asyncio.coroutine def produce():     """Сопрограмма выдачи данных."""     yield from asyncio.sleep(0.5)     data = random.randint(0, 100)     return data def main():     loop = asyncio.get_event_loop()     loop.run_until_complete(consume())     loop.close() if __name__ == '__main__':     main()   Обратите внимание, что пришлось изменить логику его работы: теперь основной является сопрограмма consumer, а producer выдаёт одну порцию данных. Причиной этого является рассмотренные ранее ограничения, накладываемые на сопрограммы asyncio, которые логично следуют из основного предназначения данного модуля: совершение асинхронного ввода-вывода. В более реальном примере аналог сопрограммы producer мог бы, например, получать данные с внешнего сервера или базы данных.
Async/Await: Герой, якого JavaScript заслужив

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

Введение Написание асинхронного кода – задача не из легких. Когда дело доходит до JavaScript, мы в значительной мере полагаемся на функции обратного вызова для выполнения асинхронных задач, которые могут быть недостаточно интуитивными. Это создает некоторый барьер входа для новичков в программировании на JavaScript и вызывает частые проблемы у тех, кто уже пользовался языком некоторое время. В этой статье мы исследуем, как можно использовать предложение для ECMAScript 2016 (ES7) для усовершенствования опыта асинхронного программирования на JavaScript, чтобы сделать наш код более понятным и простым в написании. Мир сегодняшнего дня Давайте начнем с рассмотрения попытки асинхронного программирования. Следующий пример использует библиотеку запросов, чтобы сделать http-запрос к the Ron Swanson Quotes API и выведет ответ на консоли. Чтобы это сработало, нужно вставить следующий файл с именем app.js и запустить npm install request для установления зависимости. Если у Вас не установлен Node.js, можете скачать его отсюда. var request = require('request'); function getQuote() {     var quote;     request('http://ron-swanson-quotes.herokuapp.com/quotes', function (error, response, body) {         quote = body;     });     return quote; } function main() {     var quote = getQuote();     console.log(quote); } main(); Почему это происходит? Причина того, что цитата переменной неопределенна, в том, что функция обратной связи не вызывается до тех пор, пока не закончится функция запроса. Но так как функция запроса выполняется асинхронно, JavaScript не ждет завершения. Вместо этого он переходит к следующему оператору, который возвращает неопределенную переменную. Для лучшего объяснения того, как JavaScript работает «под капотом», просмотрите эту интересную беседу Филипа Робертса на JSConf EU. Синхронный код, как правило, легче понять и написать, потому что все выполняется в том порядке, в котором оно написано. Возвращаемые значения имеют широкое применение и довольно интуитивны на других языках, но, к сожалению, мы не можем использовать их так часто, как  мы бы хотели в JavaScript, так как они не работают с его асинхронной природой. Так зачем идти по пути асинхронного кодирования? Представьте, что сетевые запросы и чтение с диска являются тем, что мы называем операциями ввода/вывода (I/O input/output). В синхронном I/O исполнении программа блокируется и ждет передачи данных для завершения. Если это занимает 60 секунд для того, чтобы обратиться к базе данных для завершения, то программа ждет, ничего не делая, в течение 60 секунд. Однако, во время выполнения асинхронной I/O операции, программа может возобновить нормальное выполнение и иметь дело с результатами I/O операции, когда бы они ни поступили. Поэтому и существуют функции обратного вызова, но с обратными вызовами гораздо труднее работать и понимать при чтении источника приложения. Утопия Можем ли мы получить лучшее из обоих миров – асинхронный код, который позволяет нам работать с блокированными операциями, но также простой в чтении и написании, как синхронный. Ответ – да. Благодаря предложению ES7 для асинхронных функций (Async/Await). Когда функция декларирована как асинхронная, тогда она в состоянии обеспечить выполнение вызываемого кода, пока он ожидает  решения promise. Вы можете заменить код в app.js следующим. Мы также должны установить Babel  для запуска. Сделайте это с помощью npm install babel. Babel будет преобразовывать наш код ES7 в более работоспособную современную версию.  var request = require('request'); function getQuote() {     var quote;     return new Promise(function(resolve, reject) {         request('http://ron-swanson-quotes.herokuapp.com/quotes', function(error, response, body) {             quote = body;             resolve(quote);         });     }); } async function main() {     var quote = await getQuote();     console.log(quote); } main(); console.log('Ron once said,'); Можно видеть, что мы возвращаем promise, что оборачивает сетевой запрос внутри нашей getQuote функции. Внутри функции обратного вызова, переданной запросу, мы вызываем функцию решения promise с телом результата. Выполните следующее, чтобы запустить этот пример. ./node_modules/.bin/babel-node app.js // Ron once said, // {"quote":"Breakfast food can serve many purposes."} Этот код выглядит довольно круто и близок к оригинальной попытке. Он выглядит довольно синхронным, хотя это не так. В случае, если Вы не заметили, «Ron once said» был напечатан первым, несмотря на то, что вызывается после main. Это показывает, что мы не блокируем работу, пока ожидаем завершения запроса сети. Внесение улучшений Мы можем и дальше улучшить код, добавляя обработку ошибок с блоком try/catch. Если существует ошибка во время запроса, мы можем вызвать функцию отмены promise, которая будет искать ошибки внутри main. Как возвращаемые значения, блоки try/catch ранее недостаточно использовались, потому как их было трудно правильно использовать с асинхронным кодом.  var request = require('request'); function getQuote() {     return new Promise(function(resolve, reject) {         request('http://ron-swanson-quotes.herokuapp.com/quotes', function(error, response, body) {             if (error) return reject(error);             resolve(body);         });     }); } async function main() {     try {         var quote = await getQuote();         console.log(quote);     } catch(error) {         console.error(error);     } } main(); console.log('Ron once said,'); Выполните этот код, и Вы сможете увидеть найденное исключение через изменение URL-запроса во что-то похожее к http://foo. Преимущества Есть несколько довольно приятных преимуществ, которые могут действительно изменить способ, которым мы писали асинхронный код JavaScript. Возможность написать код, который работает асинхронно, но выглядит синхронным и делает такие программные конструкции, как return и try/catch, проще в использовании, безусловно, поможет сделать язык более доступным. Лучшей частью является то, что мы можем использовать нашу новую особенность со всем, что возвращает promise. Для примера, возьмем библиотеку Twilio Node.js library. Вы также должны иметь учетную запись Twilio. Начните с запуска npm install twilio. Затем добавьте следующее в файл под названием twilio.js и замените поля в линиях, отмеченные // TODO Вашими собственными учетными данными и цифрами. ./node_modules/.bin/babel-node twilio.js var twilio = require('twilio'); var client = twilio('YOUR_TWILIO_ACCOUNT_SID', 'YOUR_TWILIO_AUTH_TOKEN'); // TODO async function sendTextMessage(to) {     try {         await client.sendMessage({             to: to,             from: 'YOUR_TWILIO_PHONE_NUMBER', // TODO             body: 'Hello, Async/Await!'         });         console.log('Request sent');     } catch(error) {         console.error(error);     } } sendTextMessage('YOUR_PHONE_NUMBER'); // TODO console.log('I print out first to show I am async!');   Так же, как мы показали выше с функцией getQuote, мы отметили sendTextMessage как async, что позволяет ему ждать (await) решения, возвращенного promise с client.sendMessage. Подводя итоги Вы увидели, как можно, используя преимущество предложения функции ES7, улучшить наш опыт написания асинхронного JavaScript. Мы очень взволнованы предложением Async/Await, что сейчас развивается, но пока мы этого ждем, можно использовать Babel, чтобы получить преимущества уже сегодня, со всем, что возвращает promise. Предложение недавно вышло и нуждается в обратной связи. Можете использовать его с Вашими удивительными вещами, которые Вы можете построить. Источник: https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html
Роль сертифікації для компанії та співробітника

Автор: Олександр Марченко

Введение  Продолжаем с Вами знакомиться с понятием профессиональной сертификации, и в этой части поговорим о роли сертификации для компании и для сотрудника. Большинство наших знакомых ИТ-специалистов предлагают следующие варианты обоснования целесообразности сертификации: Требуется для компании в рамках программы развития сотрудников. (Нечто подобное в Британии сделали обязательным, ознакомьтесь с понятием Chartered IT Professional); Рассчитываю на бонусы или повод для повышение заработной платы; Рассчитываю на способствование карьерному росту; Хочу подтвердить свои знания и навыки. Каждый из нас когда-то приходил к подобным умозаключениям, но кто из нас хоть однажды задумывался о том, чего ожидает компания от сертификации? Попробуем себе представить… Партнерские программы с вендором. Каждый вендор имеет программы Gold/Silver partner и подобные им. Так, когда заказчик видит подобное свидетельство качества, у него повышается уровень доверия и лояльности. Зачастую такие программы партнерства подразумевают не только финансовые взносы и соответствие многим параметрам оценки, но и присутствие в штате компании нужного числа сертифицированных специалистов. «Необходимое и достаточное условие» для участия в конкурсах и тендерах, торгах и т.д. Зачастую для того, чтобы заполучить желаемого заказчика, нужно «помочь» ему составить требования к «ожидаемому» подрядчику. А что может быть еще более непредвзятым, как мнение третьей стороны, как сертификация, выданная независимым провайдером или вендором? К тому же, если у конкурента нет такого преимуществе – победа, считайте, у Вас в кармане. Честолюбие или тщеславие. Если Вы часто бываете в крупных компаниях, особенно ИТ интеграторах, Вы видели у них стену или целый зал славы, стены в котором сплошь увешаны табличками с разными золотыми партнерскими статусами за последние N лет, наградами и почетными грамотами. А в коридорах Вы можете изучать историю сертификации доброй половины ведущих специалистов. Отбор кандидатов. Точно также, как Вы выбираете врача для своего ребенка, сервисный центр для обслуживания автомобиля, юриста с его дипломами и наградами – также и компания в лице рекрутера выбирает себе сотрудника. Вспомните, как часто у Вас просили ссылку на Ваш профиль на GitHub, кто-то спрашивал у Вас, как часто Вы даете советы или ответы на вопросы на StackOverflow или кто-то похвалил Вашу статью на популярной блоговой платформе для ИТ-шников? А как часто Вы заявляли об этом в своем резюме? И как часто Вы включаете номера своих сертификатов и обновляете их на своем профиле в LinkedIn? Думаю, Вам понятно, что сертификация — это какая-никакая гарантия качества знаний сотрудника.  В то же время, могу Вас заверить, что при активной «социальной» деятельности, которая подтверждает Ваши знания и опыт, такой как выступления на тематических конференциях, модерирование хакатонов, ведение интересных блогов, разработка курсов для начинающих разработчиков и т.д., Вам не понадобится сертификация для уверения рекрутера в Вашей надежности и соответствии требованиям проекта. Но, если Вы начинающий специалист, которому нужно оказаться лучше, чем толпы конкурентов, задумайтесь над тем, что заставит рекрутера смотреть именно в Вашу сторону, задумайтесь сможете ли Вы дать компании то, что дорого для нее.
Примусове перевизначення віртуальних методів

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

Введение Некоторые сценарии требуют, чтобы виртуальные методы были переопределены в дочерних классах, к примеру, требование переопределить GetHashCode и Equals. В этом примере будет описано, как применять подобное переопределение. Виртуальные и абстрактные методы При создании виртуального метода в классе создается метод с телом, исполняющим некоторые операции и, возможно, возвращает какое-то значение. Создание метода виртуальным подразумевает его переопределение в дочерних классах. Дочерние классы могут создавать свои методы с другим функционалом. Однако, если при создании дочернего класса не переопределить виртуальный метод, произойдет автоматическое унаследование из материнского класса. Это несколько отличается от абстрактного метода, который может быть добавлен исключительно к абстрактному классу. Абстрактные методы нефункциональны и должны быть переопределены в любом дочернем классе. Могут встретиться ситуации, когда необходимо обеспечить перезапись виртуальных методов дочерним классом, не используя определение этого метода в материнском классе. Это имеет смысл, когда необходимо переопределить виртуальный метод в пользовательском классе или стандартные методы .NET framework. Одним из наиболее простых примеров этой техники является принудительное переопределение методов ToString, Equals и GetHashCode, которые определены в классе System.Object. Это возможно сделать наряду с перегрузкой оператора == для того, чтобы убедиться, что метод Equals не использует банальное сравнение равенства ссылок для Вашего приложения. Для корректной работы необходимо, чтобы методы Equals и GetHashCode были переопределены. Можно также переопределить и ToString для того, чтобы иметь возможность включить важную информацию для использования во время ведения учета записей. Для того, чтобы убедиться в переопределении методов в классах, дочерних от абстрактного класса DataObject, необходимо переопределить их в этих классах. Также необходимо отметить новые методы как абстрактные. Например: public abstract class DataObject {     public abstract override string ToString();     public abstract override bool Equals(objectobj);     public abstract override int GetHashCode(); } Для демонстрации, что может произойти, когда производные типы в данное время не осуществляют абстрактные методы, можно использовать следующий класс. Пустой класс не включает в себя какой-либо из трех методов. public class Employee : DataObject { } При построении проекта будет сгенерировано сообщение об ошибке для каждого «потерянного» метода. В сообщениях будет описание проблемы и выглядеть оно будет следующим образом: 'ConsoleApplication1.Employee' does not implement inherited abstract member 'ConsoleApplication1.DataObject.GetHashCode()' Источник: http://www.blackwasp.co.uk/ForcedOverride.aspx
Співпрограми на основі генераторів Python

Автор: Олексій Орленко

Введение В данной статье, которая является второй из цикла об асинхронном программировании с использованием сопрограмм в Python, мы рассмотрим их классическую реализацию, доступную ещё с Python версии 2.5, при помощи расширенных возможностей генераторов (PEP 342). В Python есть механизм, который создан для удобного описания итераторов: генераторы (generators). Функцией-генератором (generator function) называется функция, которая может отдавать очередное значение при помощи ключевого слова yield и автоматически сохраняет и возобновляет своё состояние при получении следующего значения. При вызове данная функция возвращает итератор, который называется итератором генератора (generator iterator) или объектом генератора (generator object). Под генератором в зависимости от контекста понимают либо функцию-генератор, либо итератор генератора. Пример: Примечание: исходный код всех примеров доступен на GitHub: https://github.com/aqrln/itvdn-blog-async-python-examples def fibonacci():     a, b = 0, 1     while True:         yield b         a, b = b, a + b Данный генератор представляет собой бесконечную последовательность чисел Фибоначчи. Создадим объект генератора: fibonacci_sequence = fibonacci() После этого можно последовательно получать числа Фибоначчи путём вызова   print(next(fibonacci_sequence)) (Встроенная функция next вызывает метод __next__ (next в Python 2) объекта-генератора.) Или, например, получим список пар номеров и значений первых n чисел Фибоначчи: print(list(zip(range(1, n + 1), fibonacci()))) Генераторы являются частным случаем сопрограмм, также называемым semicoroutines (дословно – полусопрограммы). В отличие от классических сопрограмм, которые могут передавать управление в произвольную сопрограмму, генераторы могут передавать его лишь в место вызова метода __next__ (или send, но об этом позже), однако, для реализации асинхронных функций нам это и нужно: сопрограммы будут возвращать управление в цикл событий. В Python 3 существуют так называемые подгенераторы (subgenerators). Если в функции-генераторе встречается пара ключевых слов yield from, после которых следует объект-генератор, то данный генератор делегирует доступ к подгенератору, пока он не завершится (не закончатся его значения), после чего продолжает своё исполнение. Кроме того, yield from на самом деле является не оператором, а выражением, результат которого равен тому значению, которое функция-генератор возвращает при помощи обычного оператора return (оно сохраняется в исключении StopIteration, которое возникает при завершении генератора). Этого уже достаточно для того, чтобы реализовать асинхронное выполнение кода на основе цикла событий, и именно так реализован модуль asyncio в Python 3.4. Однако, для реализации сопрограмм в общем случае у генераторов в Python есть ещё один полезный метод: send(). Он отправляет в генератор значение, которому будет равно yield-выражение генератора (да, yield тоже является выражением, а не оператором). При помощи этих средств уже можно реализовать полноценные сопрограммы. Давайте рассмотрим пример программы, в основе которой лежат две сопрограммы: одна генерирует данные (её в таком случае называют producer), а другая – обрабатывает (consumer). Примечание: здесь и далее примеры кода написаны на Python 3 import time import random def sleep(seconds):     """Сопрограмма, которая приостанавливает сопрограмму,     из которой была вызвана, на заданное количество секунд"""     initial_time = time.time()     while time.time() - initial_time < seconds:         yield def consume():     """Сопрограмма обработки данных"""     running_sum = 0     count = 0     while True:         data = yield         running_sum += data         count += 1         print('Got data: {}\nTotal count: {}\nAverage: {}\n'.format(             data, count, running_sum / count)) def produce(consumer):     """Сопрограмма выдачи данных.     Каждые полсекунды генерирует случайное число.     """     while True:         yield from sleep(0.5)         data = random.randint(0, 100)         consumer.send(data)         yield def main():     # Создание обработчика данных     consumer = consume()     # Запуск сопрограммы     consumer.send(None)     # Создание производителя данных     producer = produce(consumer)     # Цикл событий (event loop)     while True:         next(producer) if __name__ == '__main__':     main() Здесь функция-генератор produce – это producer-сопрограмма, consume – consumer-сопрограмма, sleep вспомогательная сопрограмма, которая используются сопрограммой consume для приостановки выполнение своего «потока» на заданное время. В начале работы программы создаются объекты-генераторы consumer и producer и запускается сопрограмма consumer. Её необходимо запустить заранее (либо послав её значение None, либо вызвав next(consumer), что, на самом деле, одно и то же), так как единственным значением, которое можно отправить в генератор, пока он не запущен, является None. Причина этого в том, что значение, которое передаётся при помощи метода send(), становится значением того yield-выражения, при помощи которого генератор вернул управление, и если он ещё не запущен, то данное значение некуда присваивать. Затем запускается некоторое подобие цикла событий (с единственным возможным событием: генерация новой порции данных). Если бы в Python на уровне языка была поддержка полноценных сопрограмм с возможностью передачи управления в заданную сопрограмму, то можно было бы обойтись без него, но генераторы могут передавать управление лишь в вызывающую функцию, поэтому требуется сущность, которая управляет выполнением сопрограмм. Ей и является этот цикл. Рассмотрим сопрограмму consume. После инициализации в бесконечном цикле она повторяет следующие действия: ожидание данных при помощи yield-выражения (и, поскольку yield отдаёт управление циклу событий, в то время, пока данная сопрограмма находится в состоянии ожидания, может выполняться другой код) и их обработка: увеличение счётчиков и вывод на экран полученного числа, общего количества полученных чисел и их среднего значения. Внутри сопрограммы produce тоже находится бесконечный цикл. На каждой итерации она отдаёт управление сопрограмме sleep, которая просто отдаёт управление циклу событий через сопрограмму produce, пока не пройдёт заданный промежуток времени, а затем генерирует случайное число и отправляет его объекту-генератору consumer при помощи метода send(). Таким образом, мы реализовали параллельное исполнение двух функций внутри одного потока. Однако, в отличие от настоящей многопоточности, функции сами решают, когда им следует переключиться.   Давайте сравним это с абсолютно аналогичной программой, построенной на классических потоках: import time import random from threading import Thread, Condition class Consumer(Thread):     """Класс потока – обработчика данных"""     def __init__(self):         """Конструктор класса"""         super().__init__()         self.condition = Condition()         self.received_data = None     def run(self):         """Код, исполняемый в потоке"""         running_sum = 0         count = 0         while True:             with self.condition:                 # Ожидание доступности данных                 self.condition.wait()                 # Получение данных                 data = self.received_data             # Обработка данных             running_sum += data             count += 1             print('Got data: {}\nTotal count: {}\nAverage: {}\n'.format(                 data, count, running_sum / count))     def send(self, data):         """Метод отправки данных в обработчик"""         self.received_data = data class Producer(Thread):     """Класс потока – производителя данных"""     def __init__(self, consumer):         """Конструктор класса"""         super().__init__()         self.consumer = consumer         self.condition = consumer.condition     def run(self):         """Код, выполняемый в данном потоке"""         while True:             data = random.randint(0, 100)             with self.condition:                 self.consumer.send(data)                 self.condition.notify()             time.sleep(0.5) def main():     # Создание и запуск обработчика данных     consumer = Consumer()     consumer.start()     # Создание и запуск производителя данных     producer = Producer(consumer)     producer.start() if __name__ == '__main__':     main() Как видите, в обоих случаях код очень похожий. Сопрограммы позволяют описывать логику работы максимально приближенно к многопоточному коду, однако, в данном случае решение с сопрограммами короче, элегантнее и не требует синхронизации потоков. 
Таблиці: стовпці, шапки та підвали

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

Введение Стало быть, Вы только начинаете делать таблицу. Возможно, даже слышали о таких тегах, как tr, td, th или table, использовали атрибуты colspan, а также rowspan. Вы можете сделать такой себе милый маленький столик из фанеры, но можете и не знать, как сделать обеденный стол из твердых пород дерева, застекленная столешница которого запросто выдержит вес немаленького слона. Столбцы наносят ответный удар Как правило, таблицы строятся исключительно строками, делая столбцы ненужными элементами. К счастью для тех, кто хочет работать именно со столбцами, есть замечательные теги - colgroup и col. Эти теги дают возможность сделать столбцы в таблице, как Вам угодно, что очень удобно, если нужно изменить выравнивание или, скажем, цвет определенного столбца. Иначе придется изменять отдельные ячейки. <table>     <colgroup>         <col>         <col class="alternative">         <col>     colgroup>     <tr>         <td>             This         td>         <td>             That         td>         <td>             The other         td>     tr>     <tr>         <td>             Ladybird         td>         <td>             Locust         td>         <td>             Lunch         td>     tr> table> В примере класс "alternative"> будет применяться ко второму столбцу  или же второй ячейке каждой строки. Иногда удобно использовать атрибут span. Теги rowspan и colspan с colgroup определяют количество строк, в которых нужно объединить столбцы. Запись: <colgroup span="2"> colgroup> - группирует первые два столбца. Пример: <table>     <colgroup>         <col>         <col span="2" class="alternative">     colgroup>     В этом примере класс "alternative" использовался в двух последних столбцах. Использование тега col не обязательное, если colgroup содержит в себе span. Название эпизода Кратко и понятно про названия таблицы. Элемент caption - название таблицы, должен сразу же быть после открытия тега table. <table>     <caption>         Locust mating habitscaption>     По умолчанию название отображается над таблицей, также можно использовать CSS (caption-side: bottom). Согласитесь, хорошо предсказывать результат. Если Вы хотите сделать таблицу элементом figure, то лучше использовать figcaption вместо тега caption. Шапки и подвалы Для работы с большими таблицами удобнее всего использовать thead, tfoot и tbody для разбивки на структурные элементы header, footer и body. Всегда thead нужно писать первым в HTML-коде, а вот tfoot браузеры опустят в нижнюю часть таблицы, даже если элемент стоит выше tbody (или нескольких tbody, всё зависит от Вашей фантазии). <table>     <thead>         <tr>             <td>                 Header 1             td>             <td>                 Header 2             td>             <td>                 Header 3             td>         tr>     thead>     <tfoot>         <tr>             <td>                 Footer 1             td>             <td>                 Footer 2             td>             <td>                 Footer 3             td>         tr>     tfoot>     <tbody>         <tr>             <td>                 Cell 1             td>             <td>                 Cell 2             td>             <td>                 Cell 3             td>         tr>             tbody> table> Источник: http://www.htmldog.com/guides/html/advanced/tables/
SVG animation

Автор: Дмитро Івченко

Обзор SVG графика может быть анимирована с использованием анимационных тегов. Они были описаны в спецификации Animation SMIL. Рассмотрим эти теги: позволяет анимировать свойства в течение времени. это удобное сокращение, которое полезно для присвоения значений анимационных нечисловых атрибутов и свойств, таких как свойства opacity. который двигает вдоль траектории движения path. которая модифицирует значение цвета отдельных атрибутов или свойств с течением времени. В дополнение к элементам, определенных в SMIL, SVG включает расширения, совместимые с SMIL анимацией спецификации. Эти расширения включают в себя атрибуты, которые расширяют функционал элемента. Расширения SVG включают в себя: - дает возможность анимировать один из SVG атрибутов в течение промежутка времени, например, в качестве атрибута преобразования нового центра фигуры или преобразование фигуры и использование поворота вокруг одной из осей (Х, Y, Z). path(attr) - позволяет анимировать  вдоль определенного пути.    - используется в сочетании с animateMotion элемента для ссылки на траекторию движения, которая должна быть использована в качестве пути для движения. Элемент mpath входит внутрь animateMotion элемента перед закрывающим тегом. keypoints (attr) - задается в качестве атрибута для animateMotion, обеспечивая точный контроль скорости траектории движения анимации. rotate(attr) - используется в качестве атрибута для animateMotion для того, чтобы контролировать поворот относительно оси поворота. SVG анимации могут быть похожи на CSS анимации. Ключевые кадры создаются, объекты движутся. Но они могут сделать нечто, что CSS анимации не делает. Применение SVG Анимации SVG элементы можно стилизовать и анимировать и с помощью CSS. В принципе, любое преобразование или анимации перехода, которые могут быть применены к HTML элементу, также могут быть применены к SVG. Но существуют некоторые SVG свойства, которые не могут быть сделаны через CSS. Векторная версия путь, например, поставляется с набором данных path, который определяет траекторию этому пути. Эти данные могут быть изменены и анимированных через SMIL, но не CSS. Это потому, что SVG элементы описаны набором атрибутов, известных как SVG атрибуты представления. Если вы предпочитаете использовать JavaScript, я рекомендую использовать snap.svg, который описан как "в JQuery в SVG". Вот коллекция примеров. http://snapsvg.io/demos/ Если вы предпочитаете декларативный подход анимации, вы можете применять элементы SVG анимации, о которых я расскажу. Еще одно преимущество SMIL над JS анимацией в том, что JS анимации не работают, когда SVG встроен в качестве IMG или используется в качестве фона изображения в CSS. SMIL анимации работают в обоих случаях. Это большое преимущество, на мой взгляд. Поддержка браузеров Поддержка браузеров для SMIL анимации довольно приличная. Они воспроизводятся во всех браузерах, кроме IE. Подробный обзор поддержки браузеров вы можете посмотреть в таблице совместимости на caniuseit. Если вам нужно обеспечить альтернативный вариант для SMIL анимации, вы можете проверить поддержки браузера на лету, используя Modernizr. Если SMIL не поддерживается, вы можете предоставить какой-то запасной вариант (анимации JavaScript, например). Анимация атрибутов элемента из одного значения к другому в течение произвольного времени с указанием конечного состояния: from, by, to, dur и fill. Давайте рассмотрим с перемещением круга из одного положения в новое. Это можно сделать, изменив значение его атрибута сх (который определяет х - положение его центра). Мы собираемся использовать элемент, чтобы сделать это. Атрибуты, которым устанавливают числовые значения и цвета, как правило, анимированные с помощью . Для получения списка атрибутов, которые могут быть анимированными, обратитесь к этой таблице: http://www.w3.org/TR/SVG2/animate.html#AnimationAttributesAndProperties Чтобы изменить значение на другое в течение времени используются from, by, to, dur и fill. В дополнение к этому, вы также хотите указать, когда анимация должна начинаться с атрибутом начала. В приведенном примере, я определил круг, а затем вызываю анимацию на этом круге. Центр окружности перемещается из исходного положения - 500 единиц, до 1750 единиц вдоль оси х. Начальное значение установлено на кнопку мыши. Это означает, что круг будет двигаться, когда она нажата. Вы можете установить это значение к значению времени, а также. Например, начинают = "0s" начнет анимацию, как только страница загружена. Вы можете задержать анимацию, установив положительное значение времени. Например, начать = "6s" запустит анимацию через шесть секунды после нагрузки. Атрибут Dur похож на анимации-импульса в CSS. from - to атрибуты похожи на from to ключевых кадров в keyframe блока анимации в CSS: Повторяющиеся анимации с Repeat-Count Когда вы хотите воспроизвести анимацию несколько раз, вы можете сделать это с использованием атрибута RepeatCount. Можно указать, сколько раз вы хотите повторить или использовать ключевое слово, чтобы он без конца повторять. Так что, если мы должны были повторить анимацию вида круга в течение двух раз, код будет выглядеть так: Управление значениями ключевых кадров анимации: keyTimes и values. В CSS, мы можем задать значения, которые мы хотим, чтобы взять в определенные рамки во время анимации. 0%, 40 % , 80 % и 100% являются кадрами анимации. Анимация вдоль определенных путей: Хорошие примеры таких анимаций можно посмотреть здесь http://codepen.io/mileselam/pen/kprKm http://codepen.io/rossfenrick/pen/gpzJzz http://codepen.io/tmrDevelops/pen/yyveKv Так же более подробный пример есть на хабре http://habrahabr.ru/post/207908/ Функция прохода анимации Еще один важный элемент — это функция по которой будет проходить анимация. Среди всем известных функций анимации мы знаем ease, ease-in, ease-out, linear. Но если Вы хотите создать свою функцию прохождения анимации, то вам сюда http://cubic-bezier.com/ И напоследок лучший пример, от которого просто невозможно оторвать глаз http://codepen.io/thiennhat/pen/BNByzJ?editors=001 Пробуйте и у вас все получится!
Сертифікація: як вона з'явилася та навіщо сьогодні використовується?

Автор: Олександр Марченко

Вместо предисловия Профессиональная сертификация на сегодняшний день является неотъемлемой частью процесса развития и проверки навыков в ИТ-компаниях, впрочем, не только из ИТ-индустрии. Нужно понимать, что именно сертификация и потребность в ней породила целую индустрию обучения, подготовки и «предварительной оценки» персонала, этим занимаются как конкретные поставщики (вендоры), так и независимые. В этой статье мы рассмотрим истоки и нынешнее положение профессиональной сертификации в области информационных технологий, место сертификации в учебных программах и ресурсы, которые на сегодняшний день доступны для интеграции технологий электронного бизнеса и профессиональной сертификации в программы по компьютерным наукам и электронному бизнесу. История и предшественники Профессиональная сертификация присутствует на рынке уже не одно десятилетние. Сертификация – это норма для большинства работников медицинской сферы, педагогов, бухгалтеров, летчиков, инженеров, менеджеров и маркетологов, водителям - и тем нужны права, которые выдаются по итогам сдачи экзаменов.  Одни программы включат в себя скрупулезные очные экзамены, которые могут длиться не один день. Для других достаточно пройти тестирование и решить несколько кейсов. В сфере ИТ профессиональная сертификация зародилась относительно недавно, основы заложила компания Novell – начинающий поставщик сетевых решений, который стремился увеличить долю на рынке и максимально снизить затраты на поддержку своих продуктов путем привлечения высококвалифицированных специалистов. Хотя, многие могли бы подумать, что ветвь первенства могла бы принадлежать другому игроку на рынке сетевых решений, а именно - компании Cisco. Novell становится первым вендором, который осознал связь между образованием и квалификацией специалистов, с одной стороны, и рыночными успехами продукции, с другой стороны. Самое главное, в Novell поняли, что невозможно самостоятельно построить образовательную индустрию для реализации и укрепления маркетинговых планов и ожиданий. А именно, было принято решение обеспечить развитие рынка путем повышения уровня технических навыков по использованию сложных продуктов. Именно это сегодня можно наблюдать у Microsoft, Oracle, IBM и прочих крупнейших вендоров в их образовательных программах. По мере того, как расширялся выбор сертификаций и нарастала конкуренция за техническую лояльность, а, следовательно, и прибыль от обучения, некоторые компании оказались перед сложным выбором: смотреть в сторону технической полноты сертификационного процесса или в сторону маркетингового преимущества массовой сертификации. Слишком требовательная программа сертификации существенно сократит число людей, достигших высокого уровня владения технологиями, но повысит качество. В то же время, излишне простая сертификация размоет рынок и попросту отторгнет потребителей, поскольку будет дискредитировать вендора. Баланс был обретен лишь в 90-х путем проб и ошибок. Сегодня же сертификация – это средство оценки персонала, маркетинговый инструмент, знак качества и т.д. В следующей статье попробуем определить, что несет в себе сертификация для кандидата и компании.
Яку мову програмування варто вивчити першою?

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

Введение  «Новичку в сфере IT стоит знать одно простое правило программирования — это написание очень тонких инструкций для глупой, но послушной машины». Среди массы различных языков программирования новичку в IT очень сложно выбрать направления для дальнейшего развития, потому что каждый язык занимает определенную ячейку. Наиболее популярные, языки в "современном программировании", это: Java, Python, Objective-C, PHP, C, C++, C#, JavaScript и Ruby. Форумы и специализированные сайты переполнены тематикой «Что выбрать?» и «Куда развиваться?». И мы нашли оптимальную схему выбора ветки развития юным программистам. С чего начать изучение программирования? Итак, с чего же стоит начать?  В первую очередь ответьте предельно честно самому себе на главный вопрос: «Почему Вы хотите начать изучать программирование?». Ответов много, а предпосылок еще больше, но если провести анализ, то мотивов стать разработчиками несколько. Деньги Часто, наиболее распространенной причиной изучения программирования служит мнение о том, что программисты много зарабатывают. Да, это действительно так. Зарплаты хороших программистов могут заставить позавидовать даже некоторых менеджеров высшего звена. Но это достигается годами упорного труда, само мотивации и углубления в современные информационные технологии. Кроме того, дабы получать по-настоящему достойную зарплату, стоит сразу нацеливается на работу в хорошей крупной компании. Или же иметь идею на миллион и открывать свой start-up.   Перспективы Казалось бы, относительно недавно стоило появится первом персональному компьютеру – и нате Вам! – программисты стали одними из наиболее востребованных работниками современного рынка. Действительно, наш век – это век информационных технологий, быстроразвивающийся и динамический. Сейчас спрос на специалистов IT-сферы растет как никогда, и вряд ли стоит ждать на него спад. Все больше и больше современных компаний готовы предложить «теплое местечко». Сколько их – Google, Microsoft, EPAM прочие.   Динамичность Каждому человеку присуща толика любознательности. Но есть люди, у которых страсть изучать что-то новое просто в крови! Что же, в таком случае программирование – это именно то, что вам нужно. На данный момент существуют десятки различных направлений: мобильная разработка, настольные приложения, веб-программирование, игры, сколько их… А уж сколько для этих направлений было разработано технологий и программ – не счесть. Работая в сфере IT вы можете быть уверенным, что никогда не дадите себе заскучать! Итак, раз мы разобрались с нашими мотивами и разложили все по «полочкам», приступим же непосредственно к выбору первого языка программирования! Какой язык программирования выбрать? Теперь, самый важный вопрос: так какой же язык программирования стоит выбрать новичку в сфере IT? Прежде всего, все зависит от того, что именно вы желаете изучать. Вот график наиболее востребованных направлений области информационных технологий: Как мы можем видеть, список внушительный. Но что из этого вас прельщает больше всего? Давайте попробуем разобраться. Я бы хотел разрабатывать сайты С этим направлением не все так просто. Есть Front-End разработка сайтов – это все, что вы видите на экране. Создание веб-страниц, программ для них, стилей и много чего прочего. В таком случае вам стоит обратить свое внимание на JavaScript и HTML & CSS. А есть Back-End – разработка непосредственно программ для серверов – тех алгоритмов, которые, собственно говоря, и будут управлять страницами, сайтом и прочим. Здесь все несколько сложнее, так как сразу же появляется хороший выбор из Python, Java, C#, и PHP. Каждый из этих языков обладает как серией достоинств, так и набором откровенных недостатков. В качестве этакого старта советуем рассмотреть Python.   Настольные приложения для домашних ПК Тут бесспорными лидерами выступают такие популярные языки, как Java и C#. С одной стороны, обучение Java несколько проще и быстрее, чем C#, с другой, набор возможностей, которыми может похвалится C#, на порядок выше.   Работа с базами данных Ну, тут все однозначно: следует начинать с SQL! Администрирование, работа с реляционными базами данными и прочее, что так необходимо в современно IT-мире. Здесь можно рассмотреть вступление в язык запросов.   Игры-игры-игры! Геймерами не стают, ими рождаются. Наслаждаетесь современными продуктами игровой индустрии и сами бы хотели привнести что-то в этой увлекательный виртуальный мир? Тогда, определенно, вам стоит обратить свое внимание на С++.      Здесь можно посмотреть статистику языков программирования по популярности:              Статистика поиска соискателей по языкам и платформам: Какой самый простой язык программирования? Если начинать изучать, что начинать с простого, не так ли? Итак, вот небольшой даждест «для чайников» с чего, собственно, стоит начать обучение. JavaScript Один из наиболее легких языков программирования для веб-разработки. Динамическое наполнение web HTML страниц, целый комплекс технологий семейства React.JS, Node.JS и прочих, обилие библиотек и обучающих материалов + плюс, огромное комьюнити. Отличный старт для новичка в области IT! Вот вступление в видео-курс по JavaScript.   Python Очень легкий и приятный в освоении интерпретируемый язык универсального назначения. Обширное количество довольных пользователей, огромное количество вакансий на мировом рынке, поддержка большинством сред разработки и наличие специализированных сред разработки. Ознакомится с данным языком можно здесь.   PHP PHP – или Hypertext Preprocessor – достаточно мощный и, в то же время, легкий в освоении язык программирования для разработки серверной части веб-сайта. Имеет богатую историю и может похвалится хорошей базой различных библиотек. Ознакомится с ним вы можете здесь. Самый сложный язык программирования Быть может, вы уже имели определенный опыт, связанный с IT, и желаете попробовать себя в более «продвинутой» песочнице? Или вы не из тех, кто хочет изучать что-то простое, а сразу брать «быка за рога»? Что же, на этот случай мы можем предложить следующее: Java Отменный компилируемый язык программирования для решения целого спектра задач – от написания настольных приложений до создания серверных программ для веб-сайтов. Имеет мощную аудиторию поклонников, богатую историю, корни которой простираются в самые 90-стые и множество библиотек для практически любой задачи. Начать изучение этого языка можно здесь.   С# Язык программирования от компании Microsoft универсального назначения. Java показалась простой? Тогда C# для вас! Имеет практически идентичный с Java синтаксис, но отличается расширенном набором функций и производимых операций. WPF для оконных приложений, ASP.NET для разработки сайтов и прочие высококачественные фреймворки для всех типов задач. Что может быть лучше, чем инструмент на все случаи жизни? Приступить к работе с этим языком можно здесь.   C++ Легенда программирования. Универсальный язык программирования, возможности которого воистину не имеют ограничений. Низкоуровневая работа с памятью, разработка систем рендеринга для игр, отличная производительность и неисчерпаемый набор библиотек… С++ - это наиболее быстрый и оптимизированный язык программирования из всех существующих. Но его изучение потребует особенной усидчивости и трудолюбия. Сумеете ли вы с ним совладать? Языки программирования, какой самый оплачиваемый? Один из самых востребованных и высокооплачиваемых на рынке языков программирования - это Java. Очень популярен на всех платформах, ОС и устройствах, благодаря своей кроссплатформенности. Используется в Gmail, Minecraft, большинстве Android приложений и в корпоративных приложениях. С - это «лингва франка» среди всех языков программирования. Один из самых старых и самых широко используемых языков в мире. Отлично подходит для системного и аппаратного программирования. Он используется в ОС и оборудовании.   С# был создан на платформе Microsoft, но совсем недавно вышел на open source. С# - это популярный выбор предприятий для разработки разнообразных web-сайтов и Windows приложений, используя .NET framework. С# используют для создания web сайтов при помощи web фреймворка от Microsoft – ASP.NET. Своим синтаксисом и функционалом похож на Java. Используется в корпоративных и Windows приложениях.   Objective-C является основным языком, используемый Apple для Mac OS X и iOS. Его стоит изучать, если Вы собираетесь разрабатывать только под OS X и iOS. Стоит задуматься над изучением Swift, как о следующем языке. Objective-C используется в большинстве iOS приложений и в части Mac OS X.   C++ - это более сложная версия языка программирования С, с существенно расширенным набором возможностей. Широко используется при разработке игр, промышленных и высокопроизводительных приложений. Изучать С++ - все равно что изучать, как производить, собирать и водить машину. Этот язык не рекомендуется для самостоятельного изучения и требует наличие ментора. Он широко используется в ОС, оборудовании и браузерах. На самом деле, абсолютно не важно, с чего именно Вы начнете Ваш путь в сфере IT. Нужно знать хотя бы несколько основных языков и технологий, чтобы познать все аспекты программирования. А самое главное - начать!
Notification success