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

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

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

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

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

Результати пошуку за запитом: обучение c*
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 Пробуйте и у вас все получится!
Асинхронне програмування та співпрограми в Python

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

Введение  В этом цикле статей будет рассмотрено асинхронное программирование при помощи сопрограмм в языке Python. В данной мы рассмотрим основные понятия и термины, которыми будем оперировать в дальнейшем, вкратце познакомимся с историей асинхронного программирования и состоянием дел в этой области на сегодняшний день. Также Вы узнаете о том, что такое сопрограммы и чем они могут быть полезны при написании кода в асинхронном стиле. Во второй статье будет рассмотрена реализация сопрограмм при помощи расширенных возможностей генераторов в Python (PEP 342), в третьей мы рассмотрим модуль asyncio (PEP 3156), который стал частью стандартной библиотеки в Python 3.4 и доступен в виде отдельного пакета для Python 3.3, а четвёртая статья цикла будет посвящена асинхронным функциям и сопрограммам в Python 3.5 с использованием нового синтаксиса async/await (PEP 0492). Понятие асинхронного программирования и сопрограмм Наверное, сегодня все уже слышали о Node.js и знают причины возрастания его популярности: один язык для фронтенда и бекенда (что в рамках данной статьи нас не интересует) и то, что он является платформой для построения асинхронных неблокирующих веб-серверов. Другой известной технологией, основанной на данной модели, является веб-сервер nginx, который часто используется на высоконагруженных проектах, занимая первое место по частоте использования среди 10000 самых посещаемых сайтов в мире (согласно данным W3Techs). Так что же такое асинхронное программирование и почему оно становится таким популярным, особенно в highload-проектах? На самом деле, асинхронное программирование существовало ещё на заре вычислительной техники, так как было важно максимально использовать аппаратные ресурсы машины. Но не так давно оно стало чуть ли не стандартной парадигмой программирования, настолько, что можно сказать, что большинство написанных в наши дни приложений являются асинхронными объектно-ориентированными программами. Давайте для наглядности рассмотрим это на примере графических интерфейсов пользователя. Что происходит, когда пользователь не производит никаких действий? Ничего. Программа должна ждать, пока пользователь укажет ей, что делать. Это ожидание можно реализовать в виде постоянных проверок: «а не нажал ли пользователь на кнопку?», «а не поставил ли пользователь курсор в поле ввода?». Таким образом, вычислительные ресурсы тратятся просто на то, чтобы проверить, не случилось ли что-нибудь. К счастью, практически все UI-фреймворки построены иначе. Они реализуют систему обработки событий. Любое действие пользователя – это событие, и разработчик может привязать к нему код – обработчик события. Это настолько привычный паттерн, что многие разработчики даже не задумываются, как он работает, хотя следовало бы. Например, представьте, что на экране есть три кнопки и пользователь каким-то образом нажимает на них практически одновременно. Запустятся ли три разных обработчика событий? Как правило, ответ – нет. Наиболее распространённая архитектура системы обработки событий – однопоточная, лишь с одним потоком исполнения. Однопоточные системы обработки событий практически всегда реализуются при помощи очереди событий или сообщений. Идея состоит в том, что, когда программа ничего не делает, её поток смотрит на наличие новых событий в очереди. Когда происходит событие, оно добавляется в очередь и, если поток исполнения в это время не делает ничего другого, он забирает следующее событие из очереди и выполняет соответствующий обработчик. Таким образом, события добавляются в очередь и UI-фреймворк предоставляет диспетчер, который выполняется в том же потоке, что и обработчики, вызывая их по мере надобности. В любой момент времени поток находится либо в каком-то обработчике события, либо в диспетчере, ожидая следующего события. Возникает логичный вопрос: каким же образом событие попадает в очередь, если поток исполнения занят обработкой другого события? Дело в том, что у операционной системы много потоков и тот код, который действительно взаимодействует с пользователем, выполняется отдельно от нашей программы и лишь посылает ей сообщения. Это пример асинхронной системы, так как мы не знаем, в каком порядке будет выполнятся код. Обработчики событий, с точки зрения программы, могут выполняться произвольно. Но в данной модели обработчики событий являются неделимыми действиями. И тут возникает проблема: если обработчик событий выполняется слишком долго, интерфейс как бы «подвисает». Причина в том, что пока обработчик события не вернул управление в диспетчер, следующий обработчик не будет выполнен. Решением является минимизировать количество работы, которое выполняет обработчик события. Но что если ему требуется совершить какие-то вычисления или загрузить данные с сервера? Очевидный ответ – выполнять обработчик этого события в отдельном потоке. Однако в JavaScript есть лишь один поток исполнения, а в Python, как известно, проблемой многопоточных приложений, которая значительно их замедляет, является Global Interpreter Lock (GIL). Тут мы подходим к тому, что существует два вида многозадачности: вытесняющая и кооперативная. Потоки и процессы используют вытесняющую многозадачность. Это значит, что операционная система производит квантование времени и постоянно переключается между разными потоками, сохраняя и восстанавливая их контекст выполнения. При использовании кооперативной многозадачности ветви кода, которые исполняются параллельно, сами отдают управление в определённые моменты времени. Кооперативная многозадачность как способ одновременного выполнения отдельных программ устарела и не используется в современных операционных системах, однако, идеи, заложенные в неё, оказываются очень полезными для организации выполнения асинхронного кода и позволяют при грамотном использовании максимально использовать вычислительные ресурсы в рамках одного потока (а при комбинировании этого подхода с традиционной многопоточностью, как в async/await в C#, можно строить крайне эффективные приложения). Можно построить обработчик события из множества асинхронных функций обратного вызова (callback-функций), которые управляются общим циклом событий, как это делается в Node.js, однако такой код сложно отлаживать и поддерживать. Значительно упрощают его паттерны Promise и Future, однако Python и некоторые другие языки программирования поддерживают механизм, который позволяет в данном случае обойтись без callback-функций – сопрограммы. Сопрограмма (coroutine) – это компонент программы, обобщающий понятие подпрограммы, который дополнительно поддерживает множество входных точек (а не одну, как подпрограмма) и остановку и продолжение выполнения с сохранением определённого положения. Сопрограммы в данном случае удобны тем, что позволяют писать асинхронный код в синхронном стиле. В последующих статьях мы рассмотрим механизмы их реализации в Python.
Використання Redis як сервісу в Azure для прискорення роботи ASP.NET додатків

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

Введение Microsoft Azure использует кэш Redis в качестве сервиса. В нем существуют два уровня. Уровень Basic является одним узлом кеша, а Standard – полностью воспроизведенным кэшем (два узла с автоматической отработкой отказа). Microsoft управляет автоматической репликацией между двумя узлами и предлагает высокую доступность SLA (Service Level Agreement).  Уровень Premium может использовать до половины терабайта оперативной памяти, десятки тысяч подключений клиентов и группироваться или масштабироваться в большие блоки. Разумеется, Вы можете управлять своим Redis через виртуальную машину, но существует SAAS (Software as a Service/программное обеспечение как сервис), который все значительно упрощает – достаточно просто использовать его и остальное будет обработано. Мы испробуем Redis в качестве кэша для ASP.NET веб-приложений. В нем есть интересный Redis Desktop Manager с открытым исходным кодом. Еще один интересный графический интерфейс для Redis - это Redsmin. Для небольших приложений и сайтов мы можем сделать простой (Basic) кэш и получить 250 мегабайт. Мы сделали экземпляр объекта Redis в Azure. Его создание занимает пару минут. С ним можно взаимодействовать программно с помощью StackExchange.Redis, ServiceStack.Redis или любой из многих других больших пользовательских библиотек. Впрочем, сейчас существует мощная поддержка для Redis и кеширования в ASP.NET. Это библиотека под названием Microsoft.Web.RedisSessionStateProvider, которую можно получить из NuGet: Install-Package Microsoft.Web.RedisSessionStateProvider Она использует в себе библиотеку StackExchange, но это позволяет ASP.NET использовать объект Session и сохранять результаты в Redis, а не в памяти веб-сервера. Добавьте это к Вашей веб-конфигурации web.config: mode="Custom" customProvider="FooFoo">                       name="MySessionStateStore"             type="Microsoft.Web.Redis.RedisSessionStateProvider"             host="hanselcache.redis.cache.windows.net"             accessKey="THEKEY"             ssl="true"             port="1234" />      Вот строка из сессии ASP.NET, сохраненная в Redis, как показано диспетчером Redis Desktop Manager. Удобно использовать поставщик, если Вам не нужно делать изменений в любом коде. Вы можете отключить SSL и подключиться к кэшу Azure Redis Cache через открытый доступ в Интернет, но вам действительно лучше использовать SSL. Вот инструкции по использованию диспетчера Redis Desktop Manager с SSL и Azure Redis. Обратите внимание на часть, где Вам понадобится файл с .pem расширением, который является открытым SSL-ключом для Azure Redis Cache. Вы можете получить этот ключ SSL здесь (на момент написания этой статьи). Redis можно использовать не только в качестве состояния сессии, но и как молниеносный вывод кеша. Это означает кеширование HTTP-ответов в полном объеме. Его настройка в ASP.NET 4.x похожа на настройку провайдера состояния сессии (Session State Provider): Install-Package Microsoft.Web.RedisOutputCacheProvider Теперь, когда мы использовали атрибуты [OutputCache] в контроллерах MVC, или директивах OutputCache в веб-формах, как <%@ OutputCache Duration="60" VaryByParam="*" %>, ответы будут обработаны с помощью Redis. Только подумав о том, как работают Ваши строки запроса и URL-адреса, Вы можете быстро сделать приложение, как каталог продукции, например. И сделать это в 4-ре или 10 раз быстрее, используя кеширование. Это требует минимальных усилий, а результат приносит огромный. Странно, что даже в 2015 году некоторые люди обращаются к базе данных при каждом HTTP-запросе, когда теперешние нужды данных веб-приложений этого не требуют. Конечно, Вы можете работать с Redis напрямую через код. Вот документы для .NET, Node.js, Java и Python на Azure. Это удивительный проект, и обладать им, полностью управляемым, в качестве услуги приятно. С сайта Azure Redis: Redis является расширенным хранилищем значений ключей, которые могут содержать такие структуры данных, как строки, хэши, списки, наборы и сортированные наборы. Redis поддерживает набор атомарных операций с этими типами данных. Redis также поддерживает в установке репликацию «master-slave» с очень быстрой первой синхронизацией без блокирования, автоматическим переподключением при разделении сети и так далее. Другие особенности включают транзакции, публикации/подписки, сценарии Lua, ключи с ограниченным временем действия и параметры конфигурации, что позволяют Redis действовать как кэш. Вы можете использовать Redis с помощью большинства теперешних языков программирования. Кэш Redis для Azure использует идентификацию Redis, а также поддерживает SSL-подключения к Redis. Возможно, Вы заинтересованы в Redis, но не хотите запускать его на Azure или, возможно, даже на Linux. Возможно запустить Redis с помощью Redis MSOpenTech на ОС Windows. Его можно установить с NuGet, Chocolatey или загрузить напрямую с репозитория проектов GitHub. Если у Вас Redis для Windows (это легко с Chocolatey), можете использовать redis-cli.exe в командной строке для коммуникации с Azure Redis Cache. Запустить локальный сервер Redis легко: с помощью redis-server.exe проверить его в разработке, а затем изменить строку Redis-подключения Вашего приложения при развертывании на Azure. Можете проверить. В течение 30 минут Вы сможете настроить Ваше приложение, чтобы использовать кэш (Redis или другой) и увидеть некоторое, действительно, значительное ускорение. Источник: http://www.hanselman.com/blog/UsingRedisAsAServiceInAzureToSpeedUpASPNETApplications.aspx
Створення програми Microsoft Band за допомогою Web Tiles Частина 2

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

Введение В предыдущей статье мы осветили Microsoft Band и как с помощью Web Tiles создать свой собственный интерфейс. Установка на Band Вы можете переслать этот файл почтой или загрузить его на OneDrive/DropBox. При попытке открытия файла приложение Microsoft Health отобразит нам один из вариантов (в зависимости от расширения). Добавьте пользовательский Web Tile к подсоединенной Band, как показано на скриншоте. Обратите внимание, как имя и иконка используются для идентификации Tile. Tiles отображаются в настройках Band. Их достаточно просто включить.  Синхронизация приложения Microsoft Health с Band может занять некоторое время, но после нее Вы увидите только что созданный Вами фрагмент Tile. Вы можете заметить, что Web Tile поддерживает заданную Вами цветовую тему независимо от собственной конфигурации Band. Также, если Вы выбрали мультистраничный Tile, как статьи TDN, то можно просмотреть до 8 страниц контента внутри Вашего Tile-приложения. Сделай сам Пока инструмент для создания Web Tile и дальнейшего разворачивания в приложении Microsoft Health работает, возможно, Вы захотите настраивать функциональные параметры. Существует более дружественный для разработки путь создания Web Tiles для Band. Во-первых, начнем с исчерпывающей документации по строительству пользовательских Web Tiles. Вы сразу поймете, что веб-элемент может иметь знак счетчика (цифровой) в дополнение к основной иконке уменьшенного размера.  В сущности, архитектура Web Tile является сжатым набором файлов, что представляются Band в специальном расширении .webtile. Так что Вы можете начать с создания папки, что будет представлять Ваш Web Tile и задать ей имя, соответствующее веб-элементу. Две обязательные части контента:  Папка иконок – вмещает все используемые в Web Tile иконки в формате PNG; Файл manifest.json – содержит все конфигурации и ссылки на активы. После того как Вы будете готовы, Вы сможете доставлять содержимое целой папки как файл архива. Если Вы пишите те же статьи TDN для Web Tile вручную, Вы могли бы назвать элемент Tile как TechyTDN – обратите внимание, как вся папка в архиве, так  потом и расширение меняют на .webtile для внедрения в Band.  MANIFEST.JSON Теперь, давайте поговорим о файле manifest.json , где происходит все волшебство и Вам надо определить, как работает Ваш Web Tile. Manifest содержит всю информацию (в виде одиночного объекта JSON), которая необходима приложению Microsoft Health для установки и использования Web Tile. Вот его содержание, на случай если Вы хотели построить вручную те же TDN-статьи для Web Tile. {     "manifestVersion" : 1,     "name" : "Techy TDN",     "description" : "Telerik Developer Network Articles",     "version" : 1,     "versionString" : "1",     "author" : "Sam Basu",     "organization" : "Telerik",     "tileIcon" :     {         "46" : "icons/tileIcon.png"     },     "refreshIntervalMinutes" : 120,     "resources" :     [         {         "url" : "http://developer.telerik.com/feed/",         "style" : "feed",         "content" :             {             "articleTitle" : "channel.item.title",             "articleAuthor" : "channel.item.creator"             }         }     ],     "pages" :     [         {         "layout" : "MSBand_ScrollingText ",         "condition": "true",         "textBindings" :             [                 {                 "elementId" : "1",                 "value" : "{{articleAuthor}}"                 },                 {                 "elementId" : "2",                 "value" : "{{articleTitle}}"                 }             ]         }     ] } Большинство элементов manifest-файла не требуют объяснений, но некоторые стоит обсудить: tileTheme – позволяет управлять цветовой темой, в случае если Вам надо переопределить собственную цветовую конфигурацию. refreshIntervalMinutes – интервал обновления, что контролирует частоту обновления данных. По умолчанию он равняется 30 минутам. Если Ваши данные не надо обновлять так часто, то можно немного уменьшить загруженность батареи, соответственно установив период обновления.  resources – каждый объект ресурса описывает веб-данные конечной точки, откуда Web Tile будет извлекать контент. Вам надо определить конечную точку данных URL и стиль – простой (style – simple) для общих веб-ресурсов и поток (feed) для веб-ресурсов с повторениями (как поток TDN в RSS). В дочернем объекте содержимого (content) Вам надо определить пользовательские переменные, которые информационно связаны с конкретными определениями данных в исходном материале.  pages – каждый Web Tile содержит одну или несколько страниц, и Вам надо определять макет/содержание каждой страницы через этот объект. layout относится к одному из предопределенных макетов Tile, который Вам надо выбрать – выбирайте тот, который больше всего подходит Вашему типу данных.  Объект textBindings определяет привязки между идентификаторами элементов выбранного макета и переменными данными – здесь Вам нужно повторно использовать переменные, использованные в разделе resources. Каждая страница с Вашего Web Tile также может использовать знак привязки к определенным данным, как определено в объекте iconBindings.  Наконец, можете доставить заархивированное содержание Web Tile через обычную гиперссылку HTTP.  Просто укажите пользователей на своей URL-схеме и их мобильных браузерах, а Microsoft Health сделает все остальное: mshealth-webtile://?action=download-manifest&url=   Заключение Носимые устройства являются отличными устройствами для индивидуального пользования, а присутствующие на них приложения поддерживают интерес пользователей на протяжении дня. Как показывает Microsoft Band, Вы можете поставить простой веб-контент в качестве пользовательского Web Tile на запястья пользователей и поддерживать спрос на свои приложения с помощью высококвалифицированного контента. Вы можете использовать автоматизированный инструмент разработки Web Tile или создавать его пакеты вручную, если Вам нужен более индивидуальный контроль. Источник: http://developer.telerik.com/featured/create-a-microsoft-band-app-with-web-tiles/
Створення програми Microsoft Band за допомогою Web Tiles

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

Введение Устройства, которые можно одевать, сейчас очень распространены. Они уникальные, модные, продуктивные и позволяют оставаться на связи в нашем цифровом образе жизни. Однако, надеваемые гаджеты также могут быть подрывными в мобильном пространстве. Пока разработчики увлечены переходом на кросс-платформенную разработку родных или гибридных мобильных приложений, прибывают носимые устройства от Apple, Microsoft и Google, каждая из которых обслуживает свою соответствующую платформу и прокладывает собственный путь развития как дополнение к уникальным принципам UX. Если Вы  поклонник Microsoft Band, то у Вас есть основания для радости. И не только потому, что Band – одно из немногих носимых устройств, которые работают кросс-платформенно с любым Вашим телефоном. Также очень просто добавлять пользовательские данные на запястье в качестве Band-приложения. Все, что для этого потребуется – стандартный терминал данных и немного веб-навыков.  В этой статье мы покажем, как добавлять веб-данные в Ваше устройство Band с помощью Web Tiles. Перспектива Поскольку потребителям нравятся такие устройства, возникает новая экосистема, которую разработчикам надо поддерживать. Конечно, носимые устройства забавные, очень личные и предоставляют возможности для завлечения пользовательского опыта, но разработчикам теперь приходится работать с исключительно маленькими экранами, пересматривать содержание приложений и пользовательский интерфейс, чтобы оставаться в первых рядах, учитывая переход мобильных приложений на кросс-платформу. Еще одна сложность при разработке носимых устройств исходит из того, что такие устройства неразрывно связаны с соответствующей принимающей мобильной операционной системой. В конце концов, такая разработка часто представляет собой разработку нативного приложения, и разработчик должен знать родной SDK, паттерны программирования и цель, чтобы получить нужный опыт взаимодействия(User eXperience, UX). Мы можем наблюдать, как Apple сейчас пытается дистанциировать Apple Watch от родительского iPhone в следующем выпуске Watch OS 2. Пока что нам все еще приходится обращаться к родительской системе, но обнадеживает, что у носимых гаджетов есть собственная операционная система и приложения могут быть самодостаточными, а не пребывать в зависимости от соответствующей мобильной платформы. MICROSOFT BAND Microsoft Band представляет собой нечто среднее между фитнес-устройством и умными часами. Устройство Band заполнено датчиками -  оптическим датчиком сердечного ритма, акселерометром, GPS, датчиком освещенности, температуры, ультрафиолетовым сенсором, сенсором емкости, микрофоном и гальваническим датчиком отклика на касание. Однако, несмотря на преимущества, которыми располагают все эти сенсоры, строительство приложений сильно усложняется. Разработчик SDK для Microsoft Band очень мощный, предоставляет разработчикам полный доступ к API canvas, чтобы делать убедительные приложения для Band. SDK можно применять для создания персонализированных, интерактивных фрагментов, используя пользовательские макеты, что вмещают текст, иконки, кнопки и штрих-коды. Тем не менее, Вам надо построить собственные мобильные приложения для каждой платформы, чтобы в дальнейшем построить сопутствующее устройство Band. Несмотря на то, что существует фреймворк Xamarin, позволяющий разрабатывать кросс-платформенные приложения, это далеко непросто для разработчиков. Последние обновления Все изменилось с последними обновлениями для Microsoft Band  и платформы разработки Health. Самой интересной особенностью является новая поддержка для Web Tiles. Вам больше не нужны нативные мобильные приложения, можно просто повторно использовать веб-данные. Каждый пользователь Band непременно использует приложение Microsoft Health – что изначально есть на каждой мобильной платформе. Тогда почему бы не усилить повсеместность приложения Health и интернет-подключения Band, чтобы принести в устройство облачные данные?  Web Tiles делают доставку информации к пользователям Band максимально просто и практически из любого интернет-источника. Также новым есть предварительный просмотр облачного Microsoft Health API, который предлагает RESTful API для повышения использования приложения в режиме реального времени, для фитнес-пользователей и отслеживания здоровья. Автоматизация Web Tiles Подача данных Предусматривая веб-фрагменты для Band, в первую очередь, Вам надо решить, какие данные надо выводить. Соответственно, это должны быть короткие порции информации для Ваших Band-пользователей. Вы должны выбрать правильный контент – действительно значимую информацию для беглого просмотра на пользовательском запястье. Web Tiles могут получить доступ практически к любому интернет-источнику данных , пока данные поступают через конечные точки RESTful и доступны в стандартных форматах как ATOM/JSON. Пока нет нехватки в таких конечных точках. Сейчас в свободном доступе находятся данные из Telerik Developer Network (TDN). Если Вы находитесь на сайте TDN, можете просто нажать на ссылку RSS или просто перейти к http://developer.telerik.com/feed/. Строка новостей RSS вмещает в себя статьи из TDN. Давайте рассмотрим, как создать список этих последних статей на Band-устройстве, используя Web Tiles. Инструмент разработки Самый простой способ построить Web Tiles - это использовать инструмент разработки Microsoft Band Web Tile, просто нажмите большую кнопку Get Started. Это простой 5-шаговый инструмент разработки с веб-интерфейсом. На самом деле, Вам даже не нужно быть разработчиком, чтобы им пользоваться. Мастер проведет Вас через все этапы, необходимые для создания Band Web Tile. Ниже представим разработку Web Tile для статей TDN. 1. Выберите из представленного набора стандартных макетов для отображения данных, каким образом пользователь будет запускать свой Tile. 2. Укажите инструмент разработки Web Tile на свое устройство подачи данных. Обратите внимание на использование RSS, как показано ниже. 3. Дальше мы преобразим некоторые данные, в основном, через перетягивание. В соответствии с выбранным макетом Вы получите несколько заполнителей для отображения данных. Инструмент будет влиять на подачу данных, которые Вы указали. Это для того, чтобы дать нам представление о данных, которые будут отстранены от облачного источника данных. Вам всего-то нужно переместить повторяющиеся элементы данных в динамические заполнители с помощью цветового кодирования – и все подключено. Также от устройства подачи можно задавать статический контент поверх динамического, если Вам захочется. 4. Затем, настройте цветовую схему для Web Tile и обеспечьте некоторую идентифицирующую информацию для пользователя. Обратите внимание на примерный показ того, как будут выглядеть ваши данные в Band. Здесь же Вы получите нужную иконку для представления вашего Web Tile – она должна иметь прозрачный фон, соответствовать расширению 46x46px и рекомендациям пользовательского интерфейса UI для Band. 5. Последний шаг мастера настроек позволяет скачать предварительную версию Web Tile на компьютер. В итоге, Вы получите файл с расширением .webtile  – просто архивированный файл со всеми заданными Вами конфигурациями. Источник: http://developer.telerik.com/featured/create-a-microsoft-band-app-with-web-tiles/
Notification success