-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Иное применение блокчейнов: Смарт-контракты

Вторник, 06 Июня 2017 г. 13:12 + в цитатник
В одном из наших первых постов мы рассказывали, что блокчейн представляет собой децентрализованную систему, работа которой поддерживается множеством компьютеров, объединенных в сеть. Блокчейн, хотя и обладает определенного рода недостатками (ограниченной скоростью работы, по сравнению с централизованными базами данных, а также высоким энергопотреблением — в случае блокчейнов на основе доказательства работы), все равно остается безопасным и надежным решением. Поэтому к этой технологии присматриваются разного рода финансовые институты, банки и даже гиганты IT-индустрии (IBM, Cisco и Intel).

В 1994 году криптограф Ник Сабо (Nick Szabo) предложил использовать компьютеры и криптографию для автоматического выполнения и аудита контрактов. Позднее это привело к появлению так называемых умных контрактов, или просто смарт-контрактов. Такие контракты оформляются в виде кода, а затем сохраняются в системе, где за их выполнением следит сеть компьютеров, управляющая блокчейном. О них мы и поговорим в нашем сегодняшнем материале.

/ изображение Jason Benjamin PD

Что такое смарт-контракт


Смарт-контракт — это электронный алгоритм, облегчающий или даже автоматизирующий процесс заключения договоров. Основная идея — модернизация трудоемкой процедуры таким образом, чтобы все стороны понимали соглашение одинаково и без расхождений в трактовках. Для описания условий и исходов смарт-контрактов используются языки программирования и математические инструменты (например, криптография с открытым ключом), а выполняются такие контракты на компьютерах.

Умные контракты позволяют обмениваться активами, не прибегая к услугам посредников. Кроме того, смарт-контракты не просто содержат информацию об обязательствах сторон: программный код подтверждает выполнение условий контракта и автоматически определяет, что делать с указанным активом (передать участнику сделки, вернуться отправителю или нечто посложнее). Все это время в децентрализованном реестре хранится копия этого документа, что обеспечивает его защищенность и достоверность и не позволяет ни одной из сторон изменить предопределенные условия контракта.

Одно из главных преимуществ использования блокчейна как транспорта для смарт-контрактов — отсутствие необходимости привлекать третью сторону в качестве гаранта соблюдения условий. Блокчейн распределен между многими узлами сети и руководствуется формализованным набором правил, что сводит к минимуму риск неправильного выполнения контракта (и того, что контракт не будет выполнен вообще из-за разногласий между сторонами). Таким образом, блокчейн позволяет не полагаться на авторитет посредника.

Поскольку вся информация в блокчейне хранится в виде децентрализованной бухгалтерской книги, стороны смарт-контрактов и третьи стороны (например, бухгалтеры, аудиторы или регуляторы) получают возможность легко проводить аудит выполнения контрактов. Более того, этот аудит можно проводить в реальном времени и легко автоматизировать.

Особенности консенсуса в блокчейнах обеспечивают атомарность выполнения контракта — он может быть или успешно выполнен, или отменен с активацией автоматической очистки аналогично транзакциям в СУБД. Невозможно «застрять» посреди выполнения контракта или получить различные результаты выполнения на разных узлах сети.


Выполнение смарт-контракта

Ethereum — пожалуй, наиболее популярный блокчейн для написания сложных смарт-контрактов. Вот пример кода, написанного для контракта на специально разработанном языке смарт-контрактов Solidity (язык достаточно легок для восприятия и похож на JavaScript, только со статической типизацией). Этот код реализует простейший токен, то есть полностью цифровой актив, который можно выпускать и переводить между кошельками Ethereum. В рамках смарт-контракта при каждом запросе на перевод токенов автоматически проверяется наличие необходимого их количества. Если все в порядке, то смарт-контракт изменяет баланс токена для отправителя и получателя.

Как видно из кода, смарт-контракты в Ethereum представляют собой объекты (точнее, агенты), хранящие состояние и методы, при помощи которых это состояние обновляется. Транзакции в Ethereum, соответственно, представляют собой вызовы методов контрактов. Контракты могут взаимодействовать между собой, вызывая методы других контрактов, но любое действие в конечном счете инициируется транзакцией из-за пределов блокчейна (то есть невозможно, например, настроить смарт-контракт Ethereum так, чтобы он выполнялся по расписанию).

На это есть несколько причин. Смарт-контракты должны выполняться одинаково на всех узлах сети (иначе блокчейн Ethereum расщепится на несколько частей) и должны быть проверяемыми. Поэтому взаимодействия с внешним миром для смарт-контрактов ограничиваются. По этой же причине смарт-контракты Ethereum не могут читать или писать локальные файлы или взаимодействовать с сетью — они выполняются на специально созданной для Ethereum виртуальной машине.

Программирование смарт-контрактов в той или иной степени возможно в подавляющем большинстве блокчейнов. При этом объектно-ориентированный подход Ethereum — далеко не единственный. Есть и другие — зачастую вдохновленные академическими исследованиями — языки программирования, которые куда лучше реализуют ключевые требования к смарт-контрактам. Например, некоторые блокчейны вроде Synereo используют исчисление процессов (подход, используемый в Erlang и Go), представляя смарт-контракты как процессы, взаимодействующие между собой через каналы сообщений.

На биткойн-блокчейне смарт-контракты представлены условиями, при которых можно тратить биткойны. Как уже было отмечено, биткойн-блокчейн строится на транзакциях. Эти транзакции содержат один или несколько вводов и выводов. При этом каждый ввод транзакции является неизрасходованным выводом (UTXO — Unspent Transaction Output) одной из предыдущих транзакций, записанных в блокчейне.

Любая транзакция расходует выходы предыдущих транзакций и производит новые выходы, которые будут употреблены будущими транзакциями, причем только один раз. Эта структура обладает множеством полезных математических свойств, включающих также конструктивное доказательство того, что одни и те же токены никогда не будут потрачены дважды, если каждая транзакция доказывает, что сумма ее входов больше, чем сумма ее выходов. При этом каждый вывод транзакции ассоциируется с ценностью, то есть некоторым целым числом, обозначающим количество расходуемых биткойнов.

Также каждый неизрасходованный вывод должен подразумевать пользователя (или несколько пользователей), способного потратить стоимость, связанную с UTXO. Чтобы выполнить это условие, биткойн-протокол включает в себя скрипты. С каждым UTXO в биткойн-сети ассоциируется запирающий сценарий, который определяет условия, когда этот биткойн можно потратить.

Сценарий выглядит как последовательность инструкций для стековой машины, а-ля Forth. Инструкции сценария выполняются по очереди, а каждая инструкция может влиять на стек, например, добавлять в него новый элемент, выталкивать элемент с верхушки стека, менять два верхних элемента стека местами и так далее. В языке сценариев биткойна есть инструкции для ветвления, а вот циклов нет — язык намеренно является неполным по Тьюрингу для того, чтобы минимизировать риски DoS-атак.

Чтобы запирающий сценарий успешно выполнился, надо предоставить отпирающий сценарий, который тоже является последовательностью инструкций для стековой машины. Он будет выполнен до запирающего сценария и сформирует для него начальный стек. В простейшем случае запирающий сценарий приводит некоторый открытый ключ и требует цифровой подписи соответствующим закрытым ключом:

<Ключ> CHECKSIG

где:
  • <Ключ> — инструкция добавить в стек байты, соответствующие открытому ключу;
  • CHECKSIG — инструкция, которая выталкивает из стека два последних элемента (подпись и открытый ключ) и проверяет подпись.

Отпирающий сценарий (для запирающего сценария, представленного выше) состоит из одного элемента — цифровой подписи транзакции. Алгоритм выполнения сценариев выглядит следующим образом:

// 1. Инициализация
сценарий: <Подпись>
стек: пусто
// 2. Выполняется единственная инструкция отпирающего сценария
сценарий: пусто
стек: <Подпись>
// 3. Начинается запирающий сценарий
сценарий: <Ключ> CHECKSIG
стек: <Подпись>
// 4. Первая инструкция — добавить ключ в стек
сценарий: CHECKSIG
стек: <Подпись> <Ключ>
// 5. Вторая инструкция — проверить подпись
сценарий:
стек: <успех>

В биткойне реализуемы и более сложные смарт-контракты, например, контракт депонирования средств с возможностью возврата по таймауту:

IF
// Требует любые 2 из 3 подписей от Алисы, Боба или арбитра.
2 <Ключ Алисы> <Ключ Боба> <Ключ арбитра> 3 CHECKMULTISIG
ELSE
// Проверяет, что со времени поступления средств на адрес депонирования
// прошло 7 дней.
// DROP — инструкция вытолкнуть из стека элемент; здесь она нужна
// для обратной совместимости — CHECKSEQUENCEVERIFY распознается
// не всеми версиями узлов биткойна
<7 дней в секундах> CHECKSEQUENCEVERIFY DROP
// Если предыдущая проверка успешна, то средства может забрать Алиса
<Ключ Алисы> CHECKSIG
ENDIF

Этот сценарий полезен в том случае, если Алиса платит Бобу биткойны за некоторый товар, но стороны не доверяют друг другу — Алиса не хочет платить до получения товара, а Боб не хочет отдавать товар до получения биткойнов. В этом случае Алиса и Боб могут выбрать арбитра, который будет разрешать возможные спорные ситуации. После этого Алиса отправит средства на адрес, ассоциированный со сценарием выше.

В случае успешного выполнения контракта Боб получит возможность забрать средства, подписав транзакцию вместе с Алисой. Если же возникнет спорная ситуация, может вмешаться арбитр и принять сторону Алисы или Боба, подписав транзакцию вместе с одним из них. Наконец, если с момента перевода средств на адрес прошло много времени (скажем, 7 дней, как в примере выше), Алиса может вернуть депонированные средства обратно, даже без одобрения арбитра или Боба.

В терминах стековой машины биткойна, варианты отпирающего сценария могут быть такие:

// Перевод средств по согласию Алисы и Боба.
// Первый 0 необходим из-за бага в инструкции MULTISIG —
// она берет из стека на один элемент больше чем нужно.
// Последняя единица активирует ветку IF в запирающем сценарии.
0 <Подпись Алисы> <Подпись Боба> 1

// Арбитр согласился с Алисой
0 <Подпись Алисы> <Подпись арбитра> 1

// Арбитр согласился с Бобом
0 <Подпись Бобом> <Подпись арбитра> 1

// Возврат средств по тайм-ауту.
// 0 активирует ветку ELSE в запирающем сценарии.
// Этот сценарий не будет валидным, если тайм-аут еще не прошел.
<Подпись Алисы> 0

Rootstock — «саженец» в блокчейн-среде


Биткойн-блокчейн, хотя и обладает самой высокой стабильностью и безопасностью среди всех блокчейнов, из-за своих размеров все же лишен определенной гибкости, когда дело касается внедрения новых технологий. По этой причине для работы со смарт-контрактами в основном используется платформа Ethereum, так как это была первая технология, которая реализовала умные контракты в удобном для использования виде. Однако технология сталкивалась с определенными неудачами, например, в прошлом году из-за ошибки в коде, написанном на технологии Ethereum, хакеры украли порядка 64 млн долларов.

Поэтому сообщество задумалось о создании сети, которая брала бы лучшее от двух миров: надежность и защищенность от биткойна и удобство работы от Ethereum. Это привело к появлению блокчейн-решения Rootstock от RSK Labs, которая 22 мая получила инвестиции в размере 3,5 млн долларов. В развитие проекта вложились Энтони ди Иорио (Anthony Di Iorio), CEO криптовалютного кошелька Jaxx, а также несколько майнинговых фирм, в том числе Bitfury и Bitmain.

В одном из интервью генеральный директор RKS Labs Диего Зальдивар (Diego Gutierrez Zaldivar) отметил, что целью проекта является создание блокчейна, который бы получил поддержку как биткойн-майнеров, так и разработчиков приложений для смарт-контрактов, сейчас работающих с Ethereum.

По своей сути, Rootstock представляет собой децентрализованную Тьюринг-полную платформу для смарт-контрактов. Вот только вместо того, чтобы формировать всю систему с нуля, Rootstock использует экосистему биткойна, но с некоторыми улучшениями. На сегодняшний день платформа способна обрабатывать 400 транзакций за секунду, в то время как биткойн может обрабатывать лишь семь. В перспективе RSK планирует достигнуть значения в 2 000 TPS, используя протокол LTCP (Lumino Transaction Compression Protocol).

Самое большое преимущество Rootstock над другими платформами, использующими собственные блокчейны, – это объединенный майнинг (merged mining) с биткойном, что поднимает ее безопасность до уровня старшей блокчейн-сети. Технология пока испытывается в тестовой сети, но в скором времени будет запущена в реальную жизнь. Учитывая, что RSK использует биткойн-блокчейн, который на сегодняшний день является самым безопасным блокчейном, смарт-контракты на RSK смогут превзойти Ethereum в некоторых вопросах защиты. Например, они предоставят большую защищенность против отката транзакций в блокчейне и «атаки 51%».

Будущее и применение умных контрактов


Благодаря своим свойствам — безопасность системы гарантируется математическими законами (а не авторитетом посредника), лежащими в основе технологии блокчейна и биткойна в частности — смарт-контракты находят применение в разных сферах деятельности. Одним из потенциальных направлений развития смарт-контрактов является выборная система. Умные контракты позволят полностью исключить вероятность вмешательства в выборы третьими лицами. В этом случае голоса избирателей будут помещаться в распределенный реестр (естественно, в зашифрованном и анонимизированном виде).

Другое применение цифровых контрактов — в логистике. В сфере снабжения задействовано большое число различных документов, которые необходимо подписать и утвердить на разных уровнях. Это создает лазейки для мошенников, которые получают возможность заработать. Блокчейн позволяет построить систему таким образом, что каждый из участников цепочки поставок будет иметь доступ к электронной системе, контролирующей все процессы выполнения работ. Это оказывается эффективно при работе с документами в целом. Например, банк Barclays применяет смарт-контракты для регистрации перехода прав собственности и автоматической регистрации платежей в кредитные организации.

Еще одна сфера, в которой смарт-контракты найдут применение, — это автоиндустрия. С помощью умных контрактов страховые компании смогут устанавливать размер взносов в зависимости от того, как и в каких условиях водители управляют автомобилями. Такие системы даже смогут определять, кто был виноват в аварии: датчики или водитель, а также разрешать более сложные дорожные инциденты.

Стоит отметить и другие индустрии, такие как кредитование и бухгалтерский учет. Здесь смарт-контракты будут использоваться для оценки рисков и проведения аудита в реальном времени. На сайте Blockchain Technologies говорится, что умные контракты будут представлять собой бумажно-электронный гибрид, когда они подтверждаются блокчейном, а затем распечатываются в виде бумажной копии.

При этом многие участники рынка убеждены, что в будущем компании смогут полностью перейти от составления традиционных контрактов к их цифровому воплощению и даже реализации контрактов при поддержке искусственного интеллекта.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330316/


Метки:  

[Перевод] Хакер, хакни себя сам

Вторник, 06 Июня 2017 г. 13:08 + в цитатник

Метки:  

[Из песочницы] 12 часов в шкуре Android разработчика глазами JS разработчика

Вторник, 06 Июня 2017 г. 12:52 + в цитатник
Все началось с Kotlin. Случайно попалась статья про новый язык, что на нем можно писать под Android. Соприкоснувшись с темой, узнал что изначально приложения под Android пишутся на JAVA. Решил узнать на сколько трудоемко писать приложения под Android, в чем преимущества платформы на практике. Ведь по сути приложения JS и приложения Android выполняют одну и туже функцию. Заодно решил провести эксперимент. Что можно сделать за 12 часов, не зная что такое JAVA и тонкости разработки под Android, используя как помощник только Google. Пришла идея, которую развил в постановку задачи.

image

Постановка задачи


Взять из внешнего сервиса список всех Аэропортов мира и по коду Аэропорта получить от внешнего сервиса он-лайн табло с информацией о статусах рейсов. В 100% приложений, которые лежат в google play и реализуют такую функцию, нужно проходить цепочку действий, искать внутри приложения. Я лично, не нашел агрегатор, который позволял бы на первой странице ввести любой Аэропорт и получить его он-лайн табло. Идея и приложение само по себе простое, но это функция которой пользуется любой кто совершает перелет. Доступ к такой информации должен быть мгновенным.

Нашел потрясающий сервис, который открывает много возможности в части разработки под Авиацию. developer.flightstats.com Зарегистрировался получил на месяц бесплатный аккаунт.

Действовал интуитивно, полагаясь на свой опыт разработки в JavaScript. Набросал скетчи экранов в Photoshop. Составил требования к приложению.

Форма «Поиск»


  • Приложение должно загружать список всех аэропортов мира в компонент типа «Выпадающий список».
  • Дать возможность с помощью фильтра выбирать аэропорт, переключать время UTC/LT(местное время)

Форма «Результат»


  • Вывод данных в виде таблицы
  • Сортировка по времени Прилет\Вылет

image

Разработка


Дальше был Я, Google и Android Studio.

Из опыта понимаю что код нужно организовывать. Интуитивно определил структуру проекта. Выделил следующие группы(Models, Stores, Views, Fields, API, Adapters) Двигало мной в этот момент бессознательное, вернее опыт. Дальше начал развлекаться с Layouts. Android Studio очень интуитивный редактор, это одна из причин которая подвигла попробовать написать Android приложение. Если kind of intellij idea – значит все комфортно. Плюс редактор лежит в бесплатном доступе, никаких ограничений, развивается и обновляется регулярно. Layouts сложились на раз два. Ни одного глюка за весь период работы, все на своих местах.

Момент который меня насторожил в самом начале, в 90% источниках, поиск и работа ведется по ID компонента. Обще принято, работа с ID это bad practice, в Android оказалось нормальной практикой. Погуглил, одно из лекарств DataBinding, отличная вещь, позволяет уйти от findViewById. Но, принцип в начальной стадии и еще год назад связь работала в одну сторону. Звучит странно, DataBinding но в одну сторону. Нужно было писать свою реализацию чтобы DataBinding был полноценный. Опираясь на реализации в JS, удивил концепт, который на текущий момент предлагает Data Binding Library(можно увидеть в большинстве случаев в сети), в ViewModel размещается логика по обработке handlers от визуальных компонент, которые в свою очередь могут иметь прямой доступ к данным которые лежат в ViewModel. С виду какой то гибрид контроллера и ViewModel.

image

Далее пошли вопросы коммуникации, то что нагуглилось с первого раза повергло в шок. Чтобы сделать обычный AJAX запрос нужно было тянуть строк 70 кода. Создавать фоновый процесс и там уже творить магию соединения, а потом через буфер собирать ответ. «Не может быть, чтобы было так сложно!» и продолжил поиск. В одном из результатов попалась статья про Retrofit2. С Retrofit стало все веселее и в целом жить можно в части коммуникаций. Определился с интерфейсами взаимодействия с сервером и начал сопрягать данные с визуальными компонентами.

image

С фильтром spinner(он же combobox) пришлось повозиться, возможно из-за неопытности. По ходу возникала куча вопросов от конвертации одного типа в другой до как реализован ООП в JAVA, но все элементарно находилось в stack overflow с ответами и примерами, плюс интуиция. В целом все шло как по маслу, кроме некоторых моментов. Чего не ожидал, что получу головную боль с датой. Почему то JAVA(или может быть это у меня так вышло) по defaul выдавала все в UTC.

В целом каких то совсем непреодолимых моментов не было из-за которых возникал полный стопор. Что не понял(зачем это сделали как dafault поведение?!) При изменении ориентации экрана(или конфигурации), ваша View которая присутствует на экране уничтожается и в новом повернутом экране заново пересоздается(фоном идет масштабная работа). Что порождает головную боль если у Вас в классе View(она же «Активность») есть динамические данные, они просто теряются при уничтожении View и с этим что-то надо делать. Дайте эту возможность, но опционально, для тех кто хочет подменять экраны при повороте. Интересно услышать мнение Android разработчика по этому поводу, возможно я не вижу всей картинки в целом.

Awesome


Потрясла производительность интерфейсов при большой нагрузке. Для теста сделал 8 spinner, в каждый забросил 4000 записей(в каждой записи еще набор свойств) и приложение даже не крякнуло. При такой ситуации, JS приложение напряглось бы, и если бы еще нужно было отображать все записи сразу, и иметь доступ работы с ними, то большая вероятность поймать зависание экрана или вообще «Опаньки». Пришлось бы тащить буферизацию вывода или решать как то алгоритмически. Но есть задачи когда нужен весь объем и сразу.

Многопоточность и фоновые процессы, на лету. Что в JS нужно можно делать с помощью webworkers, но там свои трудности, которые при разработке под Android решаются на раз, два. Причем фоном можно тягать действительно весомые объемы. Это огромное value для разработки off line приложений с сложными инженерными расчетами.

Приложение под браузер имеет свой потолок по производительности, если речь идет о высоко нагруженных интерфейсах(вывод одновременно большого объема данных) или когда фоном нужно делать объемные вычисления. Здесь перед Android приложениями снимаю шляпу. Но если Вам нужно делать что-то средне статистическое, то javascript возьмет свое скоростью разработки.

Резюме


Признаю, трудоемко писать под Android и требует в разы больше времени чем написание приложений на JS, но google интенсивно развивает и наращивает платформу. Неделя сидения за книгами и теорией Android разработки скорее всего убило бы идею попробовать сделать Android приложение и не дала бы навыков и опыта полученного за эти 12 часов. Реально столкнуться с проблемами и увидеть мир изнутри, получить первую оценку возможностей Android приложений и в будущем, столкнувшись с задачами трудно реализуемыми в JS, иметь в запасе знания куда можно еще бросить свой взгляд. Практика — быстрый путь к достижению навыков и опыта.

Что получилось: Android-приложение для просмотра он-лайн табло любого аэропорта мира.





Послесловие


При наличие других 12 часов, есть желание развить идею дальше.

Игорь
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330314/


Метки:  

WWDC — на что Apple делает ставку в 2017 году?

Вторник, 06 Июня 2017 г. 11:19 + в цитатник
Мы с bealex снова на WWDC — главной конференции Apple для разработчиков. В этом году представили как обновления в системных фреймворках и API, так и новые устройства. Как никак, сегодняшние анонсы окажут сильное влияние на то, как мы будем пользоваться мобильными устройствами на iOS и Android в ближайшее время, так что спешим поделиться наблюдениями первого дня.



iOS 11, новые iPad Pro и маки, колонка HomePod и многое другое — под катом.

Apple, компания, которую Стив Джобс называл софтверной, фокусируется всего на четырех платформах: iOS, macOS, watchOS и tvOS. Устройства, которые являются материальными контейнерами для этих операционных систем, отходят на второй план: мы пользуемся приложениями и сетью, и от железок нам по сути нужно окно в этот мир. Делая свой выбор с пользу Apple, Google или Microsoft, мы становимся заложниками экосистемы, и с каждым годом нас затягивает внутрь все глубже и глубже.

Машинное обучение и iOS


В последние годы о том, что Apple отстает от всех в машинном обучении и умных алгоритмах, не говорил только ленивый. На конференции Google I/O слова machine learning, deep neural networks и artificial intelligence произносились так же часто, как на презентациях Эпл используют эпитеты amazing, revolutionary и best device ever made. Мир меняется, и чем больше действий происходит автоматически, тем более мы довольны.

AR


В этом году на WWDC сделали большую ставку на использование телефона в качестве браузера дополненной реальности. Не прошло и года, как все помешались на Pokemon Go, а AR становится доступным всем разработчикам через набор простых API. Айфон автоматически использует данные с камеры, акселерометра и компаса для того, чтобы находить в пространстве плоскости (столы, пол), определять их размер и отслеживать перемещения устройства. Умеет даже подбирать условия освещения так, чтобы вставляемые объекты сливались с окружением.



ML, image processing


Набор низкоуровневых API для машинного обучения можно использовать для работы с изображениями с камеры. Из коробки айфон умеет обнаруживать лица и следить за произвольными объектами в кадре, но можно загружать и свои обученные модели.
Можно определять на изображении документы и сканировать их.

NLP, Siri


В iOS встроен движок работы с текстом на естественном языке. Категоризация, извлечение данных из контекста становятся доступны для всех приложений. Можно ли будет работать с русским языком или хотя бы загружать свои модели — пока непонятно.
Siri теперь работает в едином контексте на всех устройствах, синхронизируясь через iCloud. Она все больше похожа на Google Assistant. С помощью нейронных сетей она произносит слова каждый раз немного по-разному, чтобы речь была человечней.

ApplePay


Маленькое, но важное нововведение: через Apple Pay теперь можно переводить деньги друзьям и знакомым. Точно можно отправлять и запрашивать их через iMessage, а вот будет ли возможность проинтегрировать это с другими приложениями — вопрос. Это последний штрих, теперь экосистема эппл предоставляет весь комплекс банковских услуг: карты, платежи в магазинах и в сети, p2p-переводы. Пока все банки играют в игру «мы IT-компания», Apple, настоящая IT-компания, довольно быстро перевела большую долю транзакций на себя прямо у них под носом.

DND while Driving


iOS будет распознавать, когда вы поехали в машине, и автоматически блокировать смски, уведомления, чаты и все остальное, что отвлекает от дороги.



Новый iPad Pro


Спрос на iPad упал, когда смартфоны доросли до крупных экранов. До полноценного рабочего инструмента это устройство не дотягивало даже с внешней клавиатурой, и в этом году Apple делает попытку вернуть планшету какой-то обособленный статус.

Режим многозадачности дополнился перетаскиванием файлов любого типа между различными приложениями, а управление рабочими столами все больше напоминает полноценную macOS. Размер экрана увеличили до 10.5 дюймов за счет более тонких рамок, а на улучшение качества картинки работают частота обновления 120 Hz и расширенная цветопередача.

Приложение Files, которое засветилось в аппсторе за несколько часов до WWDC — то, что превратит планшет в рабочий инструмент. По сути на iOS теперь появился полноценный файловый менеджер.



Mac и High Sierra


Для Apple нетипично представлять много устройств на WWDC, но в этом году помимо новой колонки были обновлены почти все макинтоши.
Макбуки и iMac стали быстрее, и делается это с упором на подготовку VR-контента. На замену ведерка Mac Pro придет новое поколение профессиональных десктопов — iMac Pro в черном цвете, с черной клавиатурой и мышкой. В топовой комплектации обещают ставить 18-ядерный Xeon, Radeon Vega и до 128Gb ECC памяти. Продавать начнут в конце года.

Новую версию macOS назвали High Sierra, в ней сделана сильная ставка на увеличение производительности и скорости работы. Также в Apple в очередной раз решили отказаться от устаревшего наследия: новая файловая система APFS, поддержка кодека h.265 с нативным ускорением, вместо jpeg продвигают кодек HEIF.

Фреймворк для низкоуровневых быстрых вычислений Metal обновили до версии 2.0, теперь его предлагают использовать для машинного обучения и других трудоемких вычислений, а не только для игр.



Колонка HomePod


Тим Кук говорит, что команда работала над революционной и уникальной колонкой несколько лет, и в итоге звук будет всех ошеломлять. Пока проверить это не удалось ни посетителям, ни журналистам, а продавать колонку обещают в декабре. Встроенная сири по функционалу повторяет то, как работает Google Home и Amazon Echo. Основная ставка тут на качество звука, для этого колонка адаптируется под геометрию помещения, а для стерео-режима их можно поставить две.



Инструменты разработчика. Xcode


Редактор


Самая важная часть для разработчиков, конечно же, Xcode. Каждый год его обновление казалось вынужденным, вроде как «обновили АПИ/язык/..., и Xcode нужно, ну хоть как-нибудь». Основа оставалась прежней, редактор был всё тот же. Иногда обновлялись разные мелочи со всяких сторон (просмотр документации, или Interface Builder), но в целом основной инструмент топтался на месте.

Сейчас Xcode обновился по-настоящему, хорошо. Полностью переписали на Swift редактор, который не трогали дикое количество лет. К примеру, можно наконец-то увеличить интерлиньяж (если вы думаете, что это ерунда, попробуйте сами, так лучше). Изменились описания ошибок, и теперь они не ломают верстку кода. Появились кросс-языковые рефакторинги и «трансформации кода», причём Apple обещает дать возможность всем разработчикам создавать свои собственные.

Часть рефакторингов работает точно как нужно, например, переименование. Красиво, быстро. Часть — не более, чем новый способ вставки темплейтов. Некоторые давно известны по продуктам JetBrains (extract'ы).

Xcode потихоньку становится похожим на современный редактор, а не что-то, что «необходимо, потому что нужно хоть что-то».

Разработка, тестирование, отладка


Теперь можно разрабатывать и отлаживать приложения по сети, используя для подключения Wifi. Удобство такой работы ещё нужно будет проверить (есть сомнение, что это будет работать в достаточной степени быстро), но за возможность — огромное спасибо.
Можно запускать сразу несколько симуляторов, что очень нужно в UI-тестировании и взаимодействии приложений друг с другом.

Доработали и отладочные средства. Появилось два новых анализатора: первый проверяет корректность вызовов интерфейсных методов, второй — всякие неопределенные штуки вроде деления на ноль.

Ускорению вообще было посвящено немало слайдов: постарались ускорить всё. Редактор создавали с нуля, держа в голове необходимость быстрого отображения огромных файлов. Система сборки переписана, чтобы лучше использовать многопроцессорные системы и улучшить слежение за зависимостями и изменениями кода. Ускорены UI-тесты. А поиск вообще ускорили «в 50 раз».

Да, а ещё теперь синхронизируются папки на диске и группы в Xcode.

AppStore


Чуть больше года назад, когда командовать AppStore стал Фил Шиллер, в него посыпались изменения. Например, скорость ревью сократилась на порядок. Обновляется и сам магазин, как визуально, так и по сути.

Огромных списков разношерстных приложений больше не будет. Курируемые разделы получат красивые описания, а дизайн стал минималистичным. Если раньше большая пачка обновлений вываливалась раз в неделю, то теперь обновления будут короче, но каждый день.

У кураторов AppStore появятся новые инструменты. Можно будет прорекламировать не только компанию или приложение, но сделать ссылку прямо на inApp-покупку или вставить в ленту видео.
Ну и, конечно, теперь разработчикам доступна постепенная раскатка своего приложения на аудиторию.



Все еще впереди


Огромное количество новых библиотек требует внимательного рассмотрения:
  • ARKit (дополненная реальность),
  • CoreML (машинное обучение),
  • MusicKit (доступ к музыке из сторонних приложеий),
  • AirPlay 2 (улучшенный AirPlay)
  • новые домены в SiriKit (списки, заметки),
  • поддержка Drag and Drop для Айпада,
  • сканирование QR-кодов,
  • новые возможности для фотоприложений (получение глубинной карты фотографии),
  • новые видео- и фото-кодеки...

Сессии про всё это ещё предстоит посмотреть, обдумать и понять, каким образом это можно использовать для создания новых приложений.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330298/


Обзор VR/AR новинок Google I/O 2017

Вторник, 06 Июня 2017 г. 11:10 + в цитатник
Гостевая статья от участника Google I\O 2017 и GDE по Android — Алексея Коровянского.

На прошедшей конференции Google выразила свой лидерский взгляд на развитие Virtual и Augmented Reality, важность новых технологий для дальнейшего прогресса и продемонстрировала ряд инновационных решений в данном направлении.


Google предложила термин Immersive Computing для лаконичного именования всего спектра VR/AR продуктов и технологий. Прилагательное Immersive выбрано неслучайно, ведь в Google считают, что в отличие от предшественников «Immersive computing works like we do».

Давайте разберемся подробнее, что же это такое, и поговорим о самых интересных VR/AR новинках от Google.

Путь Immersive Computing


Перфокарты, консольные приложения, GUI, Web и Mobile, VR/AR. Пройдя по пути развития технологий, мы увидим, что их внешний облик стремительно приближается к естественным формам для нашего мира.

Технологии становятся проще для понимания и взаимодействия, что значительно увеличивает их эффективность и расширяет область применения. Сегодня Immersive Computing успешно находит свое применение в образовании, искусстве, бизнесе, спорте и других сферах нашей деятельности. Например, качество образования становится значительно выше, ведь уроки могут быть более наглядными, понятными и продуктивными.

В Google убеждены в том, что Immersive Computing двигает прогресс в более человечную сторону и значительно расширяет горизонты наших возможностей.

Augmented Reality


В направлении дополненной реальности флагманским продуктом Google является Tango. С помощью дополнительного железа (сенсора глубины и широкоугольной камеры) и продвинутых алгоритмов SLAM Tango наделяет Android смартфоны возможностью уверенно ориентироваться в пространстве и создавать дополненную реальностью с шестью степенями свободы.

Технология уже подтвердила свою работоспособность и надежность в решении реальных задач. Например, c помощью Tango можно реализовать инновационную систему навигации для аэропорта, нарисовав для каждого пассажира прямо на полу (в режиме дополненной реальности) кратчайший маршрут к нужному выходу на посадку.

Другим интересным примером является эксперимент сделанный Google совместно с сингапурским музеем искусства и науки. Посетители музея получили возможность совершить виртуальное путешествие по тропическому лесу и помочь сохранить исчезающие виды растений и животных.

Также в рамках конференции анонсировали сервис визуального позиционирования (Visual Positioning Service), который поможет разработчикам и пользователям строить интерактивные маршруты внутри торговых центров и в других популярных местах.



В прошлом году было выпущено первое потребительское устройство с поддержкой Tango – Lenovo Phab 2 Pro. В 2017-м нас ждет выход второго устройства — ASUS ZenPhone AR. И как пообещал Johnny Lee (технический лидер проекта Tango), в 2018-м нас ждет гораздо больше Tango-ready устройств.

Virtual Reality / Daydream


Полгода назад Google запустила Daydream, собственную платформу для высококачественного мобильного VR. На данный момент восемь Android смартфонов, представленных на рынке, обладают поддержкой Daydream. В течение текущего года к ним добавятся флагманские модели от Samsung (Galaxy S8 и S8 Plus) и LG. Таким образом, к концу года десятки миллионов потребительских устройств будут Daydream-ready.

На Google I/O были анонсированы автономные VR шлемы на базе Daydream (работающие без использования смартфона). Позже в этом году на рынке появится два устройства, созданные Google в партнерстве с HTC и Lenovo.



Новые устройства будут позволять пользователю двигаться внутри виртуального мира. В большинстве сегодняшних VR шлемов подобная возможность реализуется за счет подключения и специальной расстановки внешних камер, что создает определенные трудности и ограничения. В новых шлемах на базе Daydream это удалось устранить за счет применения новой технологии WorldSense, основанной на алгоритмах Tango. Для того, чтобы погрузиться в мир виртуальной реальности пользователю будет достаточно одеть шлем без каких-либо подключений к PC или смартфону, без дополнительных проводов и камер.

Сама платформа Daydream получит мажорное обновление до версии 2.0 Euphrates. Весь пользовательский интерфейс системы будет доступен в VR режиме (например, для просмотра уведомлений теперь не нужно будет снимать шлем). Также Google реализовала самый популярный запрос пользователей, экран Daydream можно будет транслировать на TV через Google Cast.



Браузер Chrome будет работать в VR, в один клик запуская сайты с поддержкой WebVR в режиме виртуальной реальности. Сервис YouTube также получил большое расширение VR возможностей, теперь пользователи смогут устраивать совместные просмотры 360 видео, делясь эмоциями в реальном времени.

Google активно работает над тем, чтобы по качеству картинки Daydream не проигрывал десктопным конкурентам. На конференции был представлены инструмент Seurat, позволяющий оптимизировать сложные VR сцены для высококачественного воспроизведения в Daydream и инструмент Instant Preview для ускорения скорости разработки VR проектов (в стиле Instant Run для Android).

Подводя итоги


Immersive Computing несет с собой принципиально новые возможности для пользовательского опыта, делая технологии удобнее, креативнее и эффективнее.

За прошедший год Tango и Daydream прошли большой путь, но как и вся VR/AR отрасль, все еще находятся на ранней стадии своего развития. Поэтому в ближайшее время мы будем продолжать видеть большие обновления и значительные улучшения обеих платформ. Также мы будем наблюдать постепенное наполнение рынка устройствами, поддерживающими новые технологии, ]и всё большую востребованность immersive решений.

Что-то подобное происходило с Android в 2008-м году. Поэтому 2017-й год – это отличное время для того, чтобы начать по-настоящему инвестировать в immersive технологии!

Официальная документация:

Полезные доклады с Google I/O 2017:
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330310/


Метки:  

[Перевод] Внутренняя структура игры Contra

Вторник, 06 Июня 2017 г. 10:51 + в цитатник
image

Как и многие из тех, кто программирует видеоигры, в детстве я часто играл в игры для NES. Меня всегда поражало, как разработчики смогли добиться столь многого минимальными усилиями, поэтому я потратил кучу времени на анализ внутренней работы некоторых игр. Сегодня я начинаю серию постов, в котором буду документировать то, чему научился, с точки зрения программиста игр. Я постараюсь сосредоточиться на работе систем игры на уровне движка, а не на аппаратном уровне (то есть буду говорить о том, как игра решает, что нужно отрисовать в текущем кадре, а не о том, как работают спрайты на NES). Также я постараюсь добавить любые крупицы информации об играх, которые мне покажутся интересными, например, неочевидное с точки зрения игрока поведение или примеры багов в логике игры.

Введение в Contra


Я начну описание с игры Contra для NES. В этом разделе я сделаю краткий обзор объектов и данных, существующих в игре, а в следующих разделах подробно рассмотрю каждую систему игры, используемую для управления моделью мира. Упрощённая модель игры состоит из:

  • Персонажей игроков
  • Пуль игроков
  • Врагов и других объектов
  • Данных уровня

Персонажи игроков — это самые «тяжёлые» объекты игры. Как и можно ожидать, в ней огромное количество кода, выполняющего исключительно обработку персонажей. Пули персонажей обрабатываются по-разному для каждого типа объектов в игре по причинам, которые, возможно, связаны с производительностью. Позже мы рассмотрим, как отделение пуль игрока от других игровых объектов делает более эффективными различные аспекты игры. Последний класс объектов — это враги, управляемые простой системой объектов. В неё включены сами враги, их пули и взрывы, а также пара «дружественных» игроку объектов, таких как летающие капсулы с бонусами и сами лежащие на земле бонусы. Я буду называть все эти сущности «врагами», чтобы не использовать более общий термин «объекты». Самое важное — то, что в игре есть код, обрабатывающий их абстрактно, в отличие от персонажей и пуль игрока, которые всегда управляются специализированным кодом.

Последняя часть игровой симуляции — основанные на тайлах данные уровней. В Contra есть стандартные горизонтальные уровни, вертикальные уровни и уровни в псевдо-3D. По уровням можно перемещаться только вперёд. Игра хранит двойной буфер тайлов: в первом буфере хранятся данные коллизий и графики текущего экрана, во втором создаётся следующий экран. Ниже мы увидим, как организованы данные уровней, как они обновляются при перемещении игрока и как на их основе создаются враги.

Тайловая карта


Каждый уровень в игре составлен из серии независимых экранов. На рисунке ниже показан общий вид первого уровня игры, разделённый на 13 экранов, из которых состоит этап.

image

Каждый экран строится из набора непересекающихся друг с другом «супертайлов», каждый из которых занимает 32x32 пикселя экранного пространства. Экран всегда состоит из 8x7 супертайлов. В результате окончательный размер экрана составляет 256x224 пикселя. Нативное разрешение NES — 256x240 пикселей, поэтому Contra просто оставляет пустое экранное пространство, а не пытается разделить супертайлы пополам, чтобы полностью заполнить экран. Это довольно стандартное поведение для консольных игр того времени. Их не очень беспокоило то, что отображается сверху и снизу экрана, потому что эти части не всегда были видимы на ЭЛТ-телевизорах.

На рисунке ниже показан седьмой экран первого уровня, разделённый на 56 составляющих фон супертайлов.

image

Каждый супертайл, в свою очередь, составлен из обычных тайлов размером 8x8 пикселей, расположенных в сетке 4x4. Именно эти обычные тайлы оборудование NES использует для отображения карт фонов, поэтому все игры должны на каком-то этапе разбивать карты на тайлы размером 8x8 пикселей.

Данные коллизий


Информация о коллизиях для каждого экрана получается из окончательной схемы расположения обычных тайлов, а не создаётся как отдельная карта. Получившаяся карта коллизций составлена из блоков экрана размером 16x16 пикселей. Это значит, что каждый блок данных коллизий состоит из сетки обычных тайлов 2x2, но при получении типа коллизии для каждого блока рассматривается только верхний левый обычный тайл.

Каждый уровень определяет четыре диапазона индексов тайлов, и каждый из тайлов в диапазоне принадлежит одному из четырёх типов коллизий. Например, на первом уровне, тайлы с 0x01 по 0x05 принадлежат типу «земля». На них можно приземляться при падении, но проходить насквозь при движении влево, вверх и вправо. Тайлы с 0x06 по 0xF8 принадлежат типу коллизии «пустое пространство». Тайлы с 0xF9 по 0xFE имеют тип «вода», а тайл 0xFF принадлежит к «совершенно непроницаемым» тайлам.

На рисунке ниже показана часть первого уровня игры с наложенной на неё получившейся картой коллизий. Блоки с типом коллизии «вода» помечены синим, а блоки «земли» — зелёным. Блоки коллизии типа «пустое пространство» помечены чёрным, а непроницаемых блоков в этой части уровня нет.

image

Враги


На каждом экране есть список врагов, которых нужно создать в мире, когда игрок прокручивает его. Список отсортирован в соответствии с расстоянием, на которое нужно прокрутить экран для создания врага. Например, первый враг на первом уровне имеет значение прокрутки (скроллинга) 16, поэтому он будет создан, когда игрок начнёт игру и продвинет экран вперёд на 16 пикселей. Поскольку список отсортирован по расстоянию прокрутки, а экран можно прокручивать только в одном направлении, всегда существует только один новый «кандидат» на создание.

Вторая часть данных в каждом элементе списка — тип создаваемого врага, а также количество создаваемых врагов этого типа. Затем для каждого из этих количеств врагов есть общее значение контекста создания и значение позиции для создания врага на экране. Контекст создания не имеет значения для самой системы создания врагов, но позже интерпретируется собственной логикой обновления врага. Он используется, например, для настройки того, какой бонус упадёт из летающей капсулы, и для управления определёнными аспектами поведения бегущих солдат. Значение позиции создания врага даёт только половину информации, необходимой для размещения нового врага на экране. Для уровней с горизонтальным скроллингом он даёт положение врага по оси Y, а положение по оси X всегда будет в крайней правой стороне экрана. Если уровень скроллится вертикально, то значение положения создания является положением по оси X, а положение по Y находится всегда в верхней части экрана. Враги, которые, как кажется, создаются за уходящей назад/вниз частью экрана, на самом деле имеют встроенную логику, первым действием перемещающую их на противоположную сторону экрана.

Список врагов переменной длины завершается байтом с магическим значением, после чего игра ждёт, пока игрок выполнит скроллинг до следующего экрана, чтобы начать поиск новых создаваемых врагов из списка врагов этого экрана. Уничтожением врагов после скроллинга и исчезновения их с экрана занимаются сами враги, нет никакой системы, делающей это автоматически.

Случайное создание врагов


Кроме врагов, создаваемых в определённых местах уровня, существуют также враги, появляющиеся немного случайно. Эти враги — бегущие солдаты, часто создаваемые по краям экрана в процессе игры. Система, управляющая этими случайно создаваемыми врагами, на удивление сложна, несмотря на свою кажущуюся простой задачу. На рисунке ниже показаны те самые враги. Все бегущие по экрану солдаты были созданы случайно, пока игрок стоял неподвижно.

image

Сердце системы случайного создания врагов — это таймер, снова и снова отсчитывающий от некоторого начального значения до нуля. Каждый раз при достижении нуля существует вероятность создания врага. У каждого уровня есть интервал, используемый таймером, а на некоторых уровнях случайное создание врагов отключается присваиванием таймеру значения нуля (например, на уровне с базой и на последнем уровне). Поверх интервала по умолчанию вносится ещё две модификации для достижения необходимого конечного интервала, определяемого уровнем. Во-первых, интервал уменьшается примерно на 20% после каждого прохождения игры. Это значит, что после того, как игра отправит вас после прохождения снова на первый уровень, случайные враги создаются чаще, и так далее, пока вы будете проходить игру снова и снова. Другой фактор, снижающий интервал таймера — используемое игроком оружие. Оружие классифицируется с соответствии с тем, как их воспринимает игра: P считается наихудшим, F — чуть лучшим, M и L считаются одинаково хорошими, а S (конечно) — самое лучшее. Интервал таймера случайного создания врагов уменьшается примерно на 3% за каждое очко (0-3) текущего оружия игрока. На рисунке выше показано четвёртое прохождение игры, у игрока в руках Spread gun (S), но скриншот не даёт представления о количестве противников, постоянно выбегающих на экран.

Скорость уменьшения счётчика таймера тоже является переменной и зависит от того, скроллится ли экран в текущий момент. Если считать, что скорость уменьшения в неподвижном состоянии равна 1,0, то при беге вперёд она равна 0,75. Это приводит к тому, что при движении генерируется меньше случайных врагов. Думаю, разработчики хотели таким образом компенсировать то, что игроку при скроллинге придётся столкнуться и с неслучайно создаваемыми врагами.

Когда таймер достигает нуля, возникает вероятность создания врага. Сторона, с которой появится враг, обычно совершенно случайна. За одним специфическим исключением: когда вы находитесь на первом уровне, проходите игру впервые и на текущем экране было создано менее 30 случайных врагов, то враги будут всегда создаваться справа. Это позволяет новичкам в игре освоиться в ней. Положение по оси Y создания нового врага выбирается одним-тремя разными способами, в зависимости от того, сколько прошло кадров после запуска игры. Одну четверть времени игра ищет сверху экрана вниз платформу для создания врага. Одну четверть времени она начинает снизу экрана и выполняет поиск вверх. Оставшуюся половину времени игра пытается использовать случайное текущее положение игрока по оси Y как начальную координату Y для поиска вверх. Однако в этой логике есть «баг», который приводит к тому, что поиск начинается с самого верха экрана половину времени, только если в игре жив только один игрок. Этот «баг» на самом деле ничему не мешает, единственный его эффект — враги могут создаваться в нижней части экрана несколько чаще, чем должны.

После того, как нужное положение для создания врага выбрано, выполняется ещё несколько проверок для определения того, нужно ли выполнять создание. Если выбранное положение слишком близко к верху или низу экрана, то создание отменяется (исключение — уровень с водопадом, где создание врагов вверху экрана разрешено). Если вы находитесь на самом первом экране любого уровня, создание врагов отменяется. Ещё одна жёстко заданная проверка — если игрок находится на нескольких последних экранах уровня Snowfield, то создание противников в левой части экрана всегда отменяется. Эта проверка приводится в действие, когда игрок добирается до самой последней заснеженной платформы уровня, когда внизу видны деревья, в игрока бросают бомбы и один враг стреляет в него из стационарной пушки. Для чего нужна такая специфическая проверка, неизвестно никому. Возможно, один из разработчиков посчитал, что будет слишком сложно справляться с таким количеством опасностей одновременно (однако практически такая же ситуация возникает в самом начале этого уровня, но создание врагов слева там разрешено).

Ещё одно жёстко заданное правило добавлено, чтобы немного упростить первое прохождение игры. Если на текущем экране было меньше тридцати случайно созданных врагов, игрок проходит игру впервые и он стоит слишком близко к той стороне экрана, с которой должен возникнуть враг, то такое создание врага отменяется. Это защищает от глупых смертей при столкновении с врагами, возникшими прямо перед игроком.

Если все эти проверки пройдены, то остаётся ещё одна проверка перед созданием врага. У каждого экрана игры есть уникальное значение, управляющее различными аспектами случайно создаваемых на этом экране противников. Каждый отдельный экран может управлять дополнительной вероятностью отмены создания врага. Экраны могут либо всегда разрешать создавать врагов, либо постоянно запрещать, случайно запрещать создание 50% времени или 75% времени. И когда эта последняя проверка пройдена, настаёт время создания врага.

Существует два типа процесса создания врагов. Если игрок находится не на уровне с водопадом и экран в текущий момент скроллится, то имеется 25-процентная вероятность создания группы из трёх бегущих солдатов. Эти солдаты настроены так, что никогда не стреляют. Возможно, это ещё один «баг» или сделано специально, но для настройки поведения каждого из солдатов игра использует неинициализированную память. Поведение определяет, как они поступят при достижении конца платформы, по которой бегут (должны ли они спрыгивать или могут повернуть назад). Если это и был «баг», а не просто попытка создания выглядящего случайным поведения, то довольно несущественный.

Другой тип процесса создания, получаемый, если условия для первого типа не удовлетворяются — создание единственного бегущего солдата, поведение которого настраивается немного по-другому. В этом случае для случайной настройки возможности прыжков солдата используется обычный генератор случайных чисел. Для таких солдатов также на основании ещё одного значения экрана выбирается возможность стрельбы. Идея этого процесса в том, что каждый экран выбирает одну из небольшого набора выбранных заранее групп поведений. В каждой из групп имеется различное сочетание отсутствия стрельбы, стрельбы стоя и стрельбы лёжа. Затем для каждого создаваемого солдата случайным образом из выбранной уровнем группы выбирается соответствующая возможность стрельбы. Однако в игре есть ещё одни «баг»: на одном экране уровня Hangar определяется восьмая группа поведений, хотя существует всего семь групп. Это приводит к тому, что игра назначает солдатам на этом экране «мусорное» значение поведения (действительное значение получается из части указателей на списки экранных врагов, о которых мы говорили выше). По этой причине возникают разные несмертельные побочные эффекты. В основном солдаты мгновенно меняют направление и убегают с экрана.

Враги внутри баз


Статичные враги на базах


Враги на псевдотрёхмерных уровнях «баз» в Contra создаются по немного другой системе. Кроме того, уровни-базы разделены на экраны, каждый из которых тоже получает собственный список создаваемых врагов, но информация в списке отличается.

image

Экраны на уровнях баз не скроллятся, поэтому каждый враг в списке врагов экрана создаётся в момент перехода игрока к экрану. Каждый список врагов начинается с количества целей, которые нужно уничтожить для отключения электрического барьера и прохождения экрана. На самом деле в игре есть часть неиспользуемой логики, сразу убирающей барьер при отсутствии целей, несмотря на то, что в игре нет экранов с такой конфигурацией. Оставшаяся часть списка состоит из набора записей для каждого создаваемого врага. Первая часть данных в каждой записи сообщает координаты X и Y места создания врага на экране. Вторая часть данных задаёт тип создаваемого врага, а третья, последняя, часть — это непонятное контекстное значение создания, так же, как и в списках врагов для других типов уровней.

В момент попадания на новый экран создаются все враги из списка врагов экрана, и чтение этого списка больше не выполняется. Эти враги в основном являются статичными объектами на дальней части экрана, такими как цели и стреляющие в игрока пушки. Все другие враги, вбегающие на экран во время игры, не создаются по списку врагов экрана. Ими управляет другая система.

Циклические враги на базах


Один тип объекта из списка врагов каждого экрана на уровнях-базах на самом деле является не видимым врагом, а сущностью, управляющей всеми врагами, забегающими на экран с двух сторон. Этот объект-«родитель» обрабатывает свой собственный отдельный список врагов для каждого экрана, говорящий, когда нужно создать врагов и какого типа. Такие списки врагов тоже содержат наборы записей, по одной на каждого создаваемого врага. Первая часть данных в каждой записи определяет тип создаваемого врага и задаёт контекстное значение создания для этого врага. Вторая часть данных содержит время задержки перед созданием следующего врага. Также с каждой записью связан флаг, сообщающий, является ли текущая запись последней для экрана. После обработки последней записи объект-«родитель» возвращается к первой записи списка и начинает создавать врагов по тому же шаблону снова и снова. После того, как на одном экране этот шаблон был повторён семь раз, «родитель» уничтожает себя, и создание врагов прекращается. Это событие запускает стрельбу целей на стене по игроку.

Враги с бонусами


На некоторых экранах уровней-баз встречаются красные прыгающие враги, дающие при убийстве бонус. Появление таких врагов в основном определяется тоже по вторичному списку объекта-«родителя», но с дополнительными правилами: на каждом из экранов может быть создан только один красный враг с бонусом и создание этого врага запрещается при первом проходе вторичного списка. Данные контекста создания прыгающего врага в списке врагов «родителя» определяют, есть ли в нём бонус, и если есть, то указывается тип бонуса, падающего к игроку после убийства врага. Правило одного врага на экране применяется к созданию врага, но не убийству, поэтому если игрок пропустит красного врага, то больше на экране он не появится.

Распознавание коллизий в Contra


Распознавание коллизий


В игре Contra могут возникнут два типа коллизий: коллизии «объект-объект» и «объект-уровень». Каждый из них обрабатывается совершенно разным кодом и распознаётся по совершенно разным данным, поэтому, в сущности, они являются двумя отдельными системами.

Коллизии «объект-объект»


В начале этой статьи я упоминал, что игра отслеживает три типа объектов: игроков, пули игроков и врагов. Распознавание коллизий — это одна из тех областей, в которых используется такое разделение. Вместо проверок коллизий между всеми объектами, игра проверяет только коллизии между группами, реагирующими друг на друга. Игроки никогда не взаимодействуют с другими игроками или их пулями, а враги никогда не взаимодействуют с другими врагами, поэтому единственными важными остаются коллизии между игроками и врагами, а также между пулями игроков и врагами.

С учётом того, что в важных коллизиях «объект-объект» всегда участвуют враги, распознавание коллизий реализовано как часть обновления состояния всех врагов. В каждом кадре игра обходит циклом каждого активного врага и выполняет его логику обновления. После обновления всех врагов в дело вступает система коллизий. Она проверяет коллизии врагов с игроками, а потом коллизии с пулями игроков. Каждый враг имеет пару флагов, которые можно использовать для передачи информации о том, какие типы коллизий задействованы для этого врага. Именно поэтому некоторых врагов, таких как башни, можно подстрелить (коллизии с пулями игроков разрешены), но они не способны убить игрока при контакте (коллизии с игроками запрещены). Кроме этих флагов не используется никакой специальной логики для сужения списка потенциальных коллизий врага. Каждый враг просто проверяется на столкновение с каждым игроком и каждой пулей.

Проверка коллизии между конкретным врагом и конкретным игроком основана на проверке «точка-прямоугольник». Точка, представляющая текущее положение игрока, проверяется вместе с прямоугольником, представляющим текущий хитбокс (hit box) врага. Если на момент выполнения проверки точка находится внутри прямоугольника, то возникла коллизия. На первый взгляд, это выглядит немного странно. Нужно, чтобы игрок умирал от выстрела и в голову, и в ногу, но текущее положение игрока представлено всего одной точкой (которая обычно довольно близко к центру спрайта игрока), которая и проверяется на коллизию с вражеским хитбоксом. Чтобы система заработала, хитбоксы врагов становятся не просто границами вокруг спрайтов врагов, а скорее представлением того, где бы произошла коллизия, если бы мы проводили стандартную проверку «прямоугольник-прямоугольник». Иными словами, хитбоксы врагов представляют собой пространство, в котором должно находиться положение игрока, чтобы спрайт игрока накладывался на спрайт врага.

image

Этот процесс в действии показан на рисунке выше. На каждом из трёх скриншотов положение игрока представлено единственным зелёным пикселем в центре зелёного круга. Розовый прямоугольник показывает хитбокс, используемый белой пулей врага для проверки коллизий с положением игрока. Заметьте, что пуля врага использует разные хитбоксы в зависимости от действий игрока. Именно так игра изменяет уязвимые места игрока вместо обработки его хитбокса. У каждого врага есть своя версия хитбокса для игрока в воде, прыгающего игрока, игрока на земле, стоящего/бегущего игрока и пули игрока. Тип пули игрока не берётся в расчёт при подборе хитбокса, поэтому с точки зрения коллизий пуль нет никакой разницы между разным оружием.

Коллизии «объект-уровень»


Коллизии между объектами и самим уровнем обрабатываются системой иначе. Коллизии с уровнем проверяются только тогда, когда они необходимы. Если игроку нужно узнать, упал ли он с края платформы, то код, обновляющий бегущего игрока каждый кадр запрашивает коллизии с ногами игрока, пока не обнаружит, что под ними ничего нет. Большинству врагов вообще не нужно знать о коллизиях с уровнем, а те, кому они нужны, тоже проверяют их при необходимости в нужное время. Поддерживается единственный тип запроса — проверка точки и карты коллизий уровня, о которой мы говорили выше. Запрос коллизий возвращает код коллизии для тайла под проверяемой точкой (пустой, непроницаемый, вода или платформа), а затем вызывающий объект на основании полученных результатов выполняет необходимые действия.

3D-коллизии


Коллизии на псевдотрёхмерных уровнях-базах работают примерно так же, как и на 2D-уровнях, но с определёнными ограничениями, чтобы сохранить эффект поддельного 3D. Враги не могут сталкиваться с игроком, если их положение Y в пространстве экрана слишком мало (например, слишком близко к верхней части экрана, то есть они находятся «в глубине» экрана). Это работает, потому что известно, что игроки на этих уровнях всегда находятся внизу экрана. У пуль игроков есть таймер и они могут сталкиваться с большинством врагов, только если были на экране достаточно долго, чтобы достичь «дальней» части экрана. Для врагов, которых можно уничтожить в любом положении по оси Z в комнате (например, для катящихся гранат, которые нужно успеть взорвать, пока они не подкатятся и не убьют игрока) таймер пуль не используется. Вместо него проверяется флаг, обозначающий положение игрока «стоя/лёжа». Если пуля была выпущена, когда он лежал, то выполняется обычное двухмерное распознавание коллизий. Это срабатывает только потому, что распознавание выполняется между двумя объектами, оба из которых находятся на земле, где положение по оси Y напрямую накладывается на положение по оси Z (например, если похоже, что два объекта сталкиваются в 2D, то мы понимаем, что они сталкиваются и в 3D, но только вдоль поверхности земли). Благодаря этим ограничениями для распознавания коллизий между объектами в псевдотрёхмерном окружении можно использовать обычное, плоское 2D-распознавание.

Управление игроков


Физика игроков


Код, управлающий низкоуровневым движением игроков в Contra, очень прост по сравнению с тем, что возможно в современных физических движках. В то же время, мне всегда нравилось сверхотзывчивое управление в старых играх по сравнению с играми, где есть более физически реалистичное управление. Данные, связанные с низкоуровневым движением в Contra — это, фактически, только положение в 2D и скорость. Оба значения представлены в формате 8.8 с фиксированной запятой. Единицами измерения в них являются пиксели и пиксели/кадр, соответственно. В каждом кадре игра определяет, какая скорость должна быть у игрока и просто добавляет эту скорость к положению игрока. Горизонтальная скорость в начале кадра всегда сбрасывается до нуля, поэтому в направлении оси X нет никакого постоянного ускорения (поэтому физику движения на льду в Contra реализовать невозможно). У персонажей-врагов в игре нет даже собственной выделенной памяти для отслеживания скорости, потому что многие из них не двигаются. Те враги, которые обычно двигаются, каждый кадр «вручную» добавляют к своему текущему положению постоянную величину. В тех редких случаях, когда врагу нужно более сложное движение, он реализует собственную версию того, что им нужно делать, и не используют общий с персонажами игроков код физики.

В целом, в игре нет никакой постоянно работающей физической системы, управляющей движением игроков. Вместо этого каждый кадр, в зависимости от действий игрока, выполняются определённые вычисления, связанные с движением игрока. Например, когда игрок бежит по земле, код управления устанавливает горизонтальную скорость игрока и проверяет коллизии на уровне ног персонажа, чтобы проверить, не надо ли ему начать падать. Однако вертикальная скорость игрока не обновляется и даже не добавляется к положению игрока по оси Y. Также коллизии не проверяются над головой игрока, потому что известно, что при беге персонаж вверх не движется. Такой подход отличается от более общего подхода к симуляции физики, когда гравитация постоянно тянет игрока к земле, а реакция постоянно возвращает игрока обратно для разрешения коллизии. Подобным же образом коллизии при прыжках, пока игрок движется вверх, проверяются только над его головой. Когда достигнут пик прыжка и игрок начинает двигаться вниз, код переключается на проверку коллизий под игроком. Также во время прыжка вертикальное ускорение применяется ручным прибавлением в каждом кадре фиксированного значения к скорости игрока по оси Y. Нет никакой общей переменной ускорения, всегда добавляемой к скорости игрока, ускорение имеет ненулевое значение только при прыжке. Для вычисления движения игрока не выполняется никаких лишних проверок коллизий и математических расчётов. Каждый кадр выполняются только самые необходимые вычисления, и благодаря этому возникает ощущение очень отзывчивого управления без странного поведения.

Состояния игрока


На следующем, более высоком уровне управления поверх низкого уровня физики обычно определяется набор возможных состояний игрока, а затем каждый кадр выполняется обновление игрока в соответствии с текущим состоянием. В Contra на самом деле реализуется такая система, хотя и для текущего состояния игрока не используется единое значение. Вместо него у игроков есть несколько групп флагов, обозначающих текущее состояние игрока. Их можно разделить на группы флагов прыжков, флагов падения и флагов нахождения в воде. Когда игрок находится на земле, все эти флаги сброшены. Если он нажимает A для прыжка, устанавливается флаг прыжка, а несколько других флагов, относящихся к прыжку, обновляются в соответствии с направлением движения и направлением персонажа во время прыжка. Похожий набор флагов существует для падения. Это состояние, в которое игрок переходит при падении с края платформы или прыжке вниз сквозь землю. Флаги нахождения в воде используются только на первом уровне, когда игрок попадает в воду и начинает плыть. Эти флаги никогда не используются одновременно (например, флаги прыжка и падения никогда установлены одновременно), поэтому я не понимаю, почему вместо них не использовали единственную переменную состояния. Обычно функции управления начинают с тестирования различных флагов, а затем в зависимости от установленных флагов переходят к нужным частям кода.

Подробно об управлении


Бег в Contra включается/отключается мгновенно, в отличие от некоторых других игр, таких как Super Mario Bros., добавляющих персонажу игрока момент движения. Как я упомянул ранее, в результате горизонтальная скорость игрока в начале каждого кадра обнуляется, а затем обновляется до нужного значения в зависимости от действий игрока. Если персонаж бежит по земле, а игрок перестаёт жать кнопку «влево» или «вправо», то горизонтальная скорость остаётся нулевой и персонаж мгновенно останавливается.

Поведение при прыжках и падениях немного отличается: начав двигаться вперёд или назад, вы продолжите двигаться в том же направлении, пока либо не столкнётесь с чем-нибудь, либо не нажмёте кнопку обратного направления для движения в другую сторону. Начав двигаться горизонтально в воздухе, невозможно перестать двигаться горизонтально, пока вы не приземлитесь. Это похоже на прыжок во вращении из Metroid и отличается от поведения в таких играх, как Mega Man, где можно прекратить двигаться в воздухе, если перестать нажимать кнопку направления. Поведение в прыжке реализовано через пару флагов, являющихся частью описанных выше флагов прыжка. При нажатии влево или вправо во время прыжка включается соответствующий флаг прыжка влево/вправо, но при отпускании кнопок флаги не отключаются. Горизонтальная скорость в прыжке определяется по текущему состоянию флагов, а не напрямую по вводимому нажатию кнопок.

Кроме того, при нажатии «вниз-прыжок» Contra позволяет прыгать вниз сквозь землю на нижние платформы. Такая же механика используется в таких играх, как Chip ‘n Dale Rescue Rangers на NES, но отсутствует в других играх с похожими «односторонними» платформами (которые можно пролететь насквозь прыжком вверх, но остановиться на них при падении вниз), в таких как Super Mario Bros. 2. В Contra, когда игрок нажимает A, одновременно удерживая «вниз», вместо флага прыжка устанавливается флаг падения персонажа. Чтобы позволить пройти сквозь землю, игра записывает место на экране, которое на 20 пикселей (немного больше полного тайла коллизии) ниже текущего положения игрока по оси Y. Потом, когда игрок падает, проверка коллизий, которая обычно выполняется у ног игрока в состоянии падения, пропускается, пока текущее положение игрока по оси Y находится выше этого записанного значения.

Другие темы


Чтобы завершить с обсуждением Contra, я рассмотрю другие темы, не стоящие подробного анализа. Некоторые из этих тем относятся к подробностям программирования игры, другие — просто интересные факты о самой игре, которых я не знал раньше.

Случайные числа


В качестве источника случайных чисел всей игры используется единственное глобальное восьмибитное значение. Способ обновления в каждом кадре случайного значения довольно интересен тем, что в нём не используется какой-то конкретный алгоритм, который можно вызывать каждый кадр и получать следующее значение последовательности. Вместо этого следующее случайное значение получается проходом по небольшому циклу, пока игра находится в режиме ожидания начала следующего кадра (ожидая прерывания vblank). В это время игра постоянно прибавляет значение счётчика текущего кадра к случайному числу, снова и снова, пока видеооборудование NES не даст игре сигнал, что настало время обрабатывать следующий отображаемый кадр. Одно из последствий такого подхода: получаемая последовательность случайных чисел сильно зависит от точного выполнения уровня циклов ЦП и взаимодействия между ЦП и видеооборудованием. Это значит, что даже если два эмулятора идеально реализуют логику инструкций ЦП, они всё равно будут генерировать разные случайные последовательности, если их тайминги не точны. Явное свидетельство этого можно увидеть в демо-режиме Contra, в котором используется записанный поток нажатых кнопок. Демо должно быть детерминированным и каждый раз проигрываться одинаково. Ниже показано сравнение одного кадра демо-режима, запущенного на двух разных эмуляторах. Заметьте, что для бегущего солдата, созданного случайным образом в правом нижнем углу экрана, на Nintendulator выбрано одиночное создание, а на NESten — тройное. Так получилось потому, что последовательность случайных чисел, генерируемая двумя экземплярами игры, неодинакова. К счастью, влияние случайных чисел достаточно мало и не может полностью нарушить воспроизведение в демо-режиме.

image

Структура массивов


Contra хранит все данные о врагах и пулях в формате структуры массивов, а не в более объектно-ориентированном формате массива структур. Причина этого не имеет ничего общего с использованием кэша ЦП или инструкциями SIMD, как можно ожидать. Это просто следствие того, что у NES 16-битная адресация памяти, но регистры ЦП 8-битные. Если нужно получить доступ к данным косвенно, через указатель, то нельзя хранить адрес объекта в указателе и жёстко задать смещение к нужному элементу в команде загрузки, потому что адрес объекта может не поместиться в регистр ЦП. Вместо этого необходимо всё перевернуть и жёстко задать 16-битный адрес массива элементов для нескольких объектов в команде загрузки. После этого надо использовать регистр для хранения смещения внутри массива, чтобы получить элемент, относящийся к нужному объекту.

Пространство экрана


В Contra все действия выполняются в пространстве экрана. Положения игроков, врагов и пуль хранятся и обрабатываются в системе координат экрана (например, положение 0 всегда означает точку в пространстве, находящейся в левой части экрана, вне зависимости от того, в какое место уровня проскроллен экран). Сначала эта оптимизация кажется контринтуитивной, потому что хранение всех положений в пространстве экрана намного усложнит такие действия, как скроллинг. В этом случае для симуляции скроллинга вместо изменения единственной переменной положения скроллинга нужно каждый кадр вручную перемещать положение каждого врага, игрока и пули. Однако в конечном итоге такое решение оказывается хорошим, потому что позволяет сэкономить за один кадр гораздо больше, чем потратить. Скроллинг реализовать сложнее, но на самом деле всё сводится к прибавлению всего одного числа к положению объекта при его покадровом обновлении. И часто это просто добавляет одну лишнюю команду ЦП для каждого объекта. Большой выигрыш заключается в том, что теперь все вычисления, связанные с положениями объектов, можно выполнять через восьмибитные значения (экран NES имеет разрешение 256x240, поэтому можно определить любое положение на экране с точностью до пикселя всего одним байтом для X и Y). Поскольку NES нативно поддерживает только восьмибитную арифметику, в результате эти расчёты получаются гораздо быстрее, чем эмуляция 16-битной арифметики для управления 16-битными положениями в мире. Разумеется, это работает только для таких игр, как Contra, в которых соотношение между пространством мира и пространством экрана является простой трансляцией без масштабирования и вращения (т.е. трансформация из пространства мира в пространство экрана оказывается коммутативной с другими трансляциями, даже несмотря на то, что в целом применение трансформаций не является коммутативной операцией). Если камера могла бы отдаляться, то объекты в игре начали бы двигаться слишком быстро, а если бы камера поворачивалась, то объекты двигались бы в неправильном направлении.

Скрытое поведение


Некоторые параметры Contra изменяет в зависимости от того, сколько раз игрок прошёл игру за один раз, и от того, какое оружие у него в руках. Ниже приведён полный список различий, где FINISHED во время первого прохождения будет равно 0, во время второго — 1, и т.д. GUN равно 0 для оружия по умолчанию, 1 — для огнемёта (Fire, F), 2 — для пулемёта или лазера (Machine gun, M и Laser, L) и 3 — для Spread (S):

  • Здоровье (HP) промежуточного босса и последнего босса уровня 8 = 55 + (16 * FINISHED) + (16 * GUN)
  • HP снарядов промежуточного босса уровня 8 = 2 + FINISHED
  • HP стреляющих пастей в стенах уровня 8 = 4 + (2 * FINISHED) + GUN
  • HP скорпионов уровня 8 = 2 + FINISHED + GUN
  • HP коконов вокруг последнего босса уровня 8 = 24 + (2 * FINISHED) + (2 * GUN)
  • HP босса уровня 6 = 64 + (8 * GUN)
  • У появляющихся из-под земли красных пушек пауза перед началом стрельбы становится меньше при увеличении FINISHED
  • Случайное создание врагов происходит чаще при бОльших значениях FINISHED и GUN, а когда FINISHED равно 0, игра не создаёт врагов прямо перед игроком, а на первом уровне создаёт их только в правой части экрана
  • Серые башни в стенах поворачиваются за игроком быстрее и делают меньшие паузы перед стрельбой после стрельбы пулями из оружия с бОльшим значением GUN
  • Чем больше GUN, тем больше пуль выпускают стреляющие солдаты
  • Чем больше GUN, тем меньше времени перед стрельбой ждут пушки на экранах с боссами уровней 2 и 4, а также сами боссы
  • Если GUN равно 3, то промежуточный босс уровня 8 выстреливает три снаряда, и два во всех других случаях
  • Скорость падения на игрока скорпионов с потолка в бою с последним боссом увеличивается пропорционально значению GUN

Заключение


Contra — это одна из моих любимых игр на NES, и как программист игр я получил большое удовольствие от изучения подробностей её работы. Меня всегда удивляло, как разработчики игр того времени могли извлечь так много из смехотворно слабого и ограниченного по сравнению с современными консолями «железа». Если вам есть, что сказать об этой статье, свяжитесь со мной, чтобы я решил, стоит ли продолжать, и если да, то какие игры рассматривать дальше. Можно найти меня в Твиттере: @allan_blomquist.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330308/


Метки:  

Как заработать на API Яндекс.Денег

Вторник, 06 Июня 2017 г. 10:31 + в цитатник


С вас — идеи монетизации стриминга и реализация на API Яндекс.Денег, с нас — аудитория, реклама и деньги.


Шестой день рождения API переводов мы решили отпраздновать антихакатоном, на котором любой желающий может попробовать свои силы в борьбе за джекпот. Помимо денежного приза в 100 000 рублей мы поделимся с победителем прибылью от переводов через Яндекс.Деньги.


Приглашаем под кат всех индивидуальных разработчиков, предпринимателей и команды стартапов.


Как принять участие: нужно разработать готовое к использованию решение для сбора денег за стриминг в Сети.


Зачем это вообще нужно: количество сервисов с потоковой передачей платного контента стабильно растет, а удобного способа получения денег для них пока нет. По крайней мере такого, который был бы удобен не только владельцу сервиса, но и пользователям.


Насколько свободно творчество: в решении должны быть задействованы платежи через API Яндекс.Денег, все остальное — на ваше усмотрение. Жюри из экспертов компании выберет лучшее решение, а его авторы получат приз в 100 000 рублей и смогут забрать комиссию 0,5 % с каждой операции своего сервиса.


Когда будем подводить итоги: готовые прототипы и ваши анкеты мы принимаем до 1 августа 2017.


API позволяет выполнять следующие задачи:


  • запрашивать баланс;


  • просматривать историю операций;


  • переводить деньги между кошельками;


  • пополнять электронный кошелек с банковской карты.

Чтобы вам было проще погрузиться в решение задачи, разберем на примерах популярные сценарии использования API.


#1 Запрос доступа к операциям в кошельке


Перед совершением каких-либо операций с кошельками в Яндекс.Деньгах (например, просмотр истории операций или состояния счета) разработчику нужно получить определенные права.


К слову, авторизация приложений в Яндекс.Деньгах соответствует следующим спецификациям:

Зарегистрируйте приложение и укажите его параметры. В качестве Redirect URI задайте адрес, на который Яндекс.Деньги будут отправлять пользователя после успешной OAuth-авторизации. После этого вы получаете свой уникальный идентификатор client_id.
Теперь можно запрашивать права на проведение необходимых нам действий с кошельками пользователей. Пример запроса авторизации с правом просмотра истории операций кошелька:


POST /oauth/authorize HTTP/1.1
Host: money.yandex.ru
Content-Type: application/x-www-form-urlencoded
Content-Length: 191

client_id=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ01&response_type=code&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb&scope=account%2Dinfo%20operation%2Dhistory

По запросу авторизации пользователь перенаправляется на страницу аутентификации, где вводит логин-пароль и может подтвердить или отклонить перечень запрошенных прав:


image alt text
Интерфейс авторизации.


Результат авторизации возвращается как HTTP 302 Redirect – приложение перенаправит пользователя на адрес Redirect URI, который разработчик указал в параметрах запроса. Значение Redirect URI должно совпадать с настройками приложения, допуская возможность добавить в конце строки какие-либо дополнительные параметры. В адресе перенаправления с успешным результатом авторизации содержится параметр code — временный токен авторизации.


HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=i1WsRn1uB1ehfbb37

Последний шаг – получение токена, для которого назначен определенный набор прав. После этого приложение меняет временный токен на токен авторизации, который разработчик будет использовать для доступа к информации в кошельке:


POST /oauth/token HTTP/1.1
Host: money.yandex.ru
Content-Type: application/x-www-form-urlencoded
Content-Length: 421

code=0DF3343A8D9C7B005B1952D9B933DC56ACB7FED6D3F2590A6FD90EC6391050EDFFCC993D325B41B00F58E5383F37F6831E8F415696E1CF07676EE8D0A3655CDD7C667189DFB69BFDB7116C0329303AB2554290048BAF9B767B4C335BF0E85830AC017AD2F14D97F529893C202D3B2C27A61EE53DC4FB04DAE8E815DE2E3F865F&client_id=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ01&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

А вот такой ответ придет при успешном обмене временного токена:


HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 293
Cache-Control: no-store

{
"access_token":"410012345678901.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123"
}

Access_token является симметричным секретом, поэтому разработчику приложения стоит предпринять дополнительные меры по его защите: хранить токен в зашифрованном виде, предоставлять доступ только при успешном прохождении владельцем аутентификации.


#2 Просмотр истории операций


Когда токен получен, разработчик может использовать его для авторизованных действий с кошельком. Напомню, что конкретно эта авторизация позволила просматривать историю в кошельке пользователя.


Самый простой пример из области краудфандинга в соцсетях: некое сообщество ВКонтакте, посвященное футболу, — подписчиков много и активность хорошая, но это сделанный на досуге проект, а не цель жизни. Одно время паблик проводил встречи подписчиков и через электронный кошелек администратора собирал на эту и прочие нужды деньги. Для большей прозрачности распределения поступивших денег администратор создал таблицу и подтянул туда данные об истории операций через API. Когда кто-то отправляет в кошелек деньги, то все видят детали операции, отправителя и цель перевода.

Для просмотра данных воспользуемся методом operation-history, позволяющим персонализировать запрос разработчика. На выходе получим, например, последние 10 транзакций, или операции за последние полгода, или только расходные операции. Все зависит от аппетита пользователей, для которых разработчик создает сервис.


В случае со стримерами полезно выводить информацию по дате и времени входящего пополнения, включая его сумму, никнейм и сообщение отправителя, используемый платежный метод. Данные чаще всего фильтруются по никнейму, что может быть полезно для стримера: например, можно выбрать лучшего донатера (подписчика) и поощрить его предложением выбрать любую игру, которая будет распространяться в ближайшее время.


Пример запроса на получение пяти последних входящих зачислений в кошелек выглядит так:


POST /api/operation-history HTTP/1.1
Host: money.yandex.ru
Authorization: Bearer 410012345678901.7EE34A50588723226C886A475AD1D415471BF687CCC2AFC7664BA12F4EC2BDBA1EB82625E49BC29D114A6C6AF12F87639A877E81A5B77B81F003A9DB4CCEB9BD80C6E70B157C18410E884465276AACBD58C2D7B6022CBDFD0004B80704E82D3F0E4039A29655EFAA44F037D6BF763B0B803329FE8A0E511057173B04341C4317
Content-Type: application/x-www-form-urlencoded

records=5&type=deposition

Вот что на это может ответить сервис Яндекс.Денег:


{
  "next_record": "5",
  "operations": [

    {
      "operation_id": "548936732440013012",
      "title": "Перевод с банковской карты",
      "amount": 1.96,
      "direction": "in",
      "datetime": "2017-05-24T10:25:32Z",
      "label": "123007",
      "status": "success",
      "type": "deposition"
    },

    {
      "pattern_id": "p2p",
      "operation_id": "1097872036856016025",
      "title": "Перевод от 410012345678902",
      "amount": 0.99,
      "direction": "in",
      "datetime": "2017-05-24T10:13:38Z",
      "status": "success",
      "type": "incoming-transfer"
    },

    {
      "operation_id": "548428048231013012",
      "title": "Перевод с банковской карты",
      "amount": 1.96,
      "direction": "in",
      "datetime": "2017-05-18T13:07:28Z",
      "status": "success",
      "type": "deposition"
    },

    {
      "operation_id": "548427906481013012",
      "title": "Перевод с банковской карты",
      "amount": 1.96,
      "direction": "in",
      "datetime": "2017-05-18T13:05:06Z",
      "status": "success",
      "type": "deposition"
    },

    {
      "pattern_id": "p2p",
      "operation_id": "1096319740674326025",
      "title": "Перевод от 410012345678903",
      "amount": 0.01,
      "direction": "in",
      "datetime": "2017-05-15T10:37:50Z",
      "status": "success",
      "type": "incoming-transfer"
    }
  ]
}

Еще один пример сервиса на основе запроса к истории — коллективные закупки на форумах: люди договариваются скинуться и заказать что-то оптом по более низкой цене, а организатор собирает деньги на свой кошелек. Чтобы все видели, сколько участников в закупке и как расходуются деньги, можно использовать один из множества сервисов на базе API Яндекс.Денег. Сборщику достаточно авторизоваться кошельком в одном из таких сервисов.


#3 Проверка баланса


Игровые стримеры часто работают с несколькими мониторами, поэтому команда Яндекс.Денег разработала виджет, в котором можно указать цель сбора денег, необходимую сумму – и отслеживать прогресс. Например, стример хочет купить новую PlayStation 4. Как только в кошельке наберется нужная сумма, Яндекс.Деньги пришлют в виджет уведомление, что пора делать заказ.


image alt text
Виджет накопления.


Другой пример, когда стриминговому сервису нужен постоянный доступ к балансу — программа лояльности: в личном кабинете стримера, к примеру, можно разместить пиццерийный оффер со скидкой, по которому можно мгновенно заказать пиццу. Но перед этим сервис должен убедиться, что денег на счете достаточно для заказа.

Для просмотра баланса можно воспользоваться методом account-info:


POST /api/account-info HTTP/1.1
Host: money.yandex.ru
Authorization: Bearer 410012345678901.1578E01607EB3899853D2883E47841A195BC561F1F8CF479D593B662AD60B2D146EE49F02D750CB2972E51E0DF10369AE77FD930D82B7563AA0D65FA709A7C31EB59D4FFC1F2E85A14A817BDFB282C5A82FF1B79C65D2AE7B3BAE1C1C7D89CBE80477FF1C51A8F3DD9A032475BE629235949B7A2CA7823AC6AC06DB3176F9B54
Content-Type: application/x-www-form-urlencoded

В ответ сервер вернет следующее:


{
  "account": "410012345678901",
  "balance": 192.45,
  "currency": "643",
  "account_type": "professional",
  "identified": true,
  "account_status": "identified",
  "cards_linked": [
    {
      "type": "MasterCard",
      "id": "4005641800",
      "pan_fragment": "532130******2227"
    }
  ],
  "balance_details": {
    "total": 192.45,
    "available": 192.45,
    "blocked": 1
  }
}

В результате вы получите не только детализированную информацию по балансу, но и сведения о привязанных банковских картах: маскированный номер карты, тип, идентификатор привязанной карты.


Еще пара сценариев, где пригодится проверка баланса через API.
  • Мой любимый пример — Дзен-мани. Это сервис, который помогает пользователям следить за своим бюджетом и планировать расходы на будущее. Разработчики Дзен-мани предложили пользователям привязать кошелек Яндекс.Денег к приложению, чтобы оно могло самостоятельно добавлять новые расходные операции и доходы. Разумеется, опция полезна только активным пользователям кошелька, которые оплачивают из него большинство покупок. И это действительно большое благо, так как в учете личных финансов сложнее всего не забывать отмечать расходы в программе. Почитать, как все это работает, можно в статье Дзен-мани на Geektimes.


  • Или Classto — сервис для общения родителей и учителей. С его помощью можно собирать в общий кошелек на нужды класса не наличные, а переводы с банковских карт прямо в приложении. Еще можно проверить баланс и узнать, сколько всего денег собрано — важный элемент прозрачности сборов и трат, так как эту информацию видит любой из родителей.


#4 Перевод из кошелька


С помощью API можно инициировать не только переводы из кошелька, но и с привязанной карты. Это удобно для мгновенных расчетов с людьми, которые не держат деньги на кошельке и используют его как прослойку, чтобы не светить карту в интернете. При этом за плательщиком по-прежнему остается контроль расходов, ведь даже автоматические списания с привязанной карты нужно авторизовать.


Как это работает:


  1. После получения подтверждения от пользователя, API попробует списать из кошелька запрошенную сумму.


  2. Если денег на балансе не хватает, сервис ответит not_enough_funds.


  3. Далее сервис может списать деньги с привязанной к кошельку карты, если пользователь это разрешил. Автоматическое списание с привязанной карты доступно только получателям-юрлицам. Кроме того, списать деньги с карты не получится при переводе между кошельками.

Стримеры могут мотивировать зрителей подписаться на регулярные переводы за публичную благодарность в эфире или соцсетях, подарки или право выбора следующей игры для стрима.


Подписка выглядит следующим образом:


  1. Рядом с кнопкой «Поддержать» может стоять галка «Подписаться на ежемесячный платеж в пользу этого стримера».


  2. Когда пользователь нажимает на кнопку «Поддержать», разработчик проверяет условие регулярных платежей и корректирует список запрашиваемых прав в запросе к Яндекс.Деньгам.

Поскольку речь идет об операции в кошельке, нужно запросить разрешение на ее проведение – запрос на предоставление доступа остается практически как в примере №1, но меняется набор прав (scope).


Набор запрашиваемых прав, который позволяет совершить единовременный перевод на сумму 1000 рублей в кошелек 410012345678901, выглядит следующим образом:


payment.to-account("410012345678901").limit(,1000)

Если же отправитель подписался на регулярные платежи, авторизация может иметь следующее значение:


payment.to-account("410012345678901").limit(30,1000)

Где 30 — период времени в сутках, 1000 — общая сумма платежей за период.


Пример запроса на регулярное списание:


POST /oauth/authorize HTTP/1.1
Host: money.yandex.ru
Content-Type: application/x-www-form-urlencoded

client_id=49414287408917F4BC735301F4731878533F409F3BA8EA055D0D441EE002F69B&redirect_uri=http%3A%2F%2Fexample.com%2Fapi%2Fredirect_uri.php&response_type=code&scope=payment.to-account(%22410012345678903%22).limit(30%2C1000)

Отправитель же увидит красивую форму:


image alt text


После получения токена разработчику нужно выполнить списание через методы request-payment и process-payment:


POST /api/request-payment HTTP/1.1
Host: money.yandex.ru
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 410012345678901.D2E0917C3E09DE474DD3BF6288DDCB6818D55B6BBC8A9386ABA2A983F3F4666102F9B7A2D370D7079891299907368389F3BA8E2BE04597DCFF4CF02F4E3423896776D1C5CCE30A09B5D2E73874C5FE33CAE19286EAB03D146B46A188939BEC1ADA93F3530ECBFACA2591715F686EDBC9F616A7BF912CF4DC9CFB689473328347

pattern_id=p2p&to=410012345678903&amount=10&comment=Transfer+to+Nuke73&message=Transfer+from+SuperMan

Пример ответа:


{
  "status": "success",
  "request_id": "333235373335343733345f646366303562383436613661306133373130663766343166303137666131336262656637353539655f323537353532373836",
  "recipient_identified": true,
  "multiple_recipients_found": false,
  "recipient_account_type": "professional",
  "recipient_account_status": "identified",
  "contract_amount": 10,
  "money_source": {
    "cards": {
      "allowed": false
    },

    "wallet": {
      "allowed": true
    },

    "card": {
      "allowed": "false"
    }
  }
}

К слову о переводах и комиссиях. В личном кабинете можно выбрать, кто платит комиссию за перевод – за это отвечают параметры amount и amount_due. Если в шаблоне платежа указан параметр amount_due, то именно эта сумма поступит в кошелек стримера (комиссию оплачивает зритель). Если же стример готов взять её на себя, то на входе указывается параметр amount. Таким образом, amount (сумма к переводу) равняется сумме комиссии и amount_due (сумма к получению).

Перевод выполняется после вызова метода process-payment уже без участия пользователя, который один раз при авторизации доступа подтвердил свои намерения. В качестве request_id используется идентификатор из ответа метода request-payment.


POST /api/process-payment HTTP/1.1
Host: money.yandex.ru
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 410012345678901.D2E0917C3E09DE474DD3BF6288DDCB6818D55B6BBC8A9386ABA2A983F3F4666102F9B7A2D370D7079891299907368389F3BA8E2BE04597DCFF4CF02F4E3423896776D1C5CCE30A09B5D2E73874C5FE33CAE19286EAB03D146B46A188939BEC1ADA93F3530ECBFACA2591715F686EDBC9F616A7BF912CF4DC9CFB689473328347

request_id=333235373335343733345f646366303562383436613661306133373130663766343166303137666131336262656637353539655f323537353532373836

Пример ответа:


{
  "status": "success",
  "payer": "410012345678901",
  "payee": "410012345678903",
  "credit_amount": 9.95,
  "payment_id": "549038975018120011"
}

Отлично – списание с кошелька прошло успешно.


#5 Перевод с банковской карты


Перевод с банковской карты отличается от перевода из кошелька:


  • Во-первых, он не требует запроса на авторизацию. Чтобы идентифицировать приложение для оплаты картами, разработчик регистрирует в Яндекс.Деньгах его копию и получает instance_id с помощью одноименного метода;


  • Во-вторых, отправителю где-то нужно указать реквизиты своей банковской карты. Чтобы отображать эту форму, разработчику нужно сформировать платеж на основе стандартизированного шаблона методом request-external-payment, а затем инициировать платежную операцию с помощью process-external-payment.

Если перевод сформировался успешно, метод request-external-payment вернет следующее:


{
  "status": "success",
  "title": "Перевод на счет 410011498692222",
  "contract_amount": 102.04,
  "request_id": "333235373135303437315f36313764393332336462393164373433353264303465346432626262313465353933363763333133",
  "money_source": {
    "payment-card": {}
  }
}

После получения request_id – уникального идентификатора контекста платежа – можно инициировать платежную операцию и перенаправить пользователя на форму Яндекс.Денег. Для этого используется POST-запрос по адресу acs_uri с параметрами acs_params, где плательщику нужно указать данные банковской карты.


Пример запроса:


POST /api/process-external-payment HTTP/1.1
Host: money.yandex.ru
Content-Type: application/x-www-form-urlencoded

request_id=333235373135303437315f36313764393332336462393164373433353264303465346432626262313465353933363763333133&instance_id=hh2CVJWrU9uU7N2hpEh1LvjfyBAby8USyMUEF4DM8AS6w93o53M3xrlGHsMUiWTL&ext_auth_success_uri=http%3A%2F%2Fexample.com%2Fsuccess%2F&ext_auth_fail_uri=http%3A%2F%2Fexample.com%2Ffalse%2F&request_token=false

И ответ:


{
  "status": "ext_auth_required",
  "acs_uri": "https://m.money.yandex.ru/internal/public-api/to-payment-type",
  "acs_params": {
    "cps_context_id": "333235373135303437315f36313764393332336462393164373433353264303465346432626262313465353933363763333133",
    "paymentType": "FC"
  }
}

image alt text
Карточная форма Яндекс.Денег.


Непосредственное проведение платежа ложится на плечи Яндекс.Денег. После указания реквизитов банковской карты и нажатия на кнопку «Заплатить» пользователь попадет на страницу 3-D Secure своего банка-эмитента и после ввода пароля возвращается к сервису разработчика: если 3-D Secure-аутентификация по банковской карте завершается успешно, он попадет на страницу с подтверждением платежа (ext_auth_success_uri). Если же банк-эмитент отказал в аутентификации, пользователь перенаправляется на страницу с ошибкой (ext_auth_fail_uri).


Адреса перенаправления разработчик может указать при вызове метода process-external-payment.

Когда плательщик переходит на страницу успеха после проверки 3-D Secure, нужно удостовериться что авторизация по банковской карте тоже прошла успешно. Для этого разработчик повторно вызывает process-external-payment с ранее полученным request_id.


Пример ответа:


{
  "status": "success",
}

Обычно авторизация карты происходит в промежутке 10-20 секунд после аутентификации. Если в момент повторного вызова process-external-payment мы не получили состояние авторизации от банка, разработчик об этом обязательно узнает.


Пример подобного ответа:


{
 "status": "in_progress", 
 "next_retry": "5000"
}

Next_retry — рекомендуемое время в миллисекундах, когда следует повторить запрос. Поле присутствует только при статусе in_progress.


Дополнительные возможности: конструктор форм и кнопок


Платежное решение с использованием API требует определенных усилий и сложного технологического взаимодействия. Более простой вариант заключается в использовании готовых настраиваемых форм Яндекс.Денег: в них информация о переводе разбита на параметры и передается методом POST на специальный адрес.


image alt text


Пример интерфейса формы переводов в кошелек стримера на Яндексе.


Сценарий перевода с использованием кастомизированной формы выглядит так:


  1. Отправитель выбирает, как перевести деньги — из электронного кошелька или с банковской карты.


  2. Разработчик формирует строку из набора параметров Яндекс.Денег и передает их методом POST на адрес money.yandex.ru/quickpay/confirm.xml вместе с уникальной меткой платежа (label) для дальнейшей идентификации. Детали операции разработчик хранит в своей базе.


  3. Плательщик переходит на страницу выбора способа оплаты и подтверждения перевода на стороне Яндекс.Денег, а сумма списывается и зачисляется на кошелек стримера. Разумеется, за вычетом комиссии.


  4. Получатель узнает о поступлении средств через HTTP-уведомление, email, SMS, push. Адрес обработчика уведомлений получателю нужно заранее указать в настройках кошелька.


  5. Разработчик анализирует поступившие на адрес обработчика детали и принимает решение о дальнейших действиях. В нашем случае, если входящая сумма удовлетворяла условиям стримера, в его видеопотоке передавалось сообщение подписчика с анимированным сопровождением. Сообщение воспроизводилось с использованием технологии SpeechKit.

В этом сценарии есть один недостаток: для нормальной работы сервиса от стримера требуются лишние манипуляции с настройками HTTP-уведомлений внутри кошелька.


В отличии от API, формы и кнопки позволяют переводить деньги с привязанной банковской карты. Однако комиссия берется только с получателя.


Чтобы не требовать от стримера лишних манипуляций, достаточно научиться смотреть в его историю операций и сопоставлять уникальную метку перевода с данными из базы. Осталось только получить доступ к операциям стримера, для чего в самом начале статьи мы попросили стримера подтвердить доступ к правам account-info и operation-history. Первый метод поможет нам узнать номер кошелька стримера, второй — информацию по операциям.


Вот так выглядит ответ на запрос последних двух операций в кошельке стримера через API методом operation-history (перевод поступил через кастомизированную форму):


{
  "next_record": "2",
  "operations": [
    {
      "operation_id": "549575176734053012",
      "title": "Перевод с банковской карты",
      "amount": 49,
      "direction": "in",
      "datetime": "2017-05-31T19:46:16Z",
      "label": "yadonate#1782",
      "status": "success",
      "type": "deposition"
    },

    {
      "pattern_id": "p2p",
      "operation_id": "1098088627442030025",
      "title": "Перевод от 410011498790000",
      "amount": 9.95,
      "direction": "in",
      "datetime": "2017-05-25T16:18:33Z",
      "label": "testpayment",
      "status": "success",
      "type": "incoming-transfer"
    }
  ]
}

После проверки успешности перевода в кошелек стримера можно творить в видеопотоке любимую вами магию.


В этом посте мы рассмотрели только самые базовые идеи и сценарии использования API для стриминговых сервисов. Если что-то непонятно, смело спрашивайте в комментариях. А если среди читателей есть стримеры или их зрители — поделитесь мнением о том, как сделать донаты удобнее и веселее.


Зарегистрироваться для участия можно на Яндекс.Событиях. Прототипы и анкеты принимаем до 1 августа 2017.


От винта!

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330096/


Метки:  

Вот до чего бывают люди до чужого добра жадные, или еще одна ремарка про 44 50 49

Вторник, 06 Июня 2017 г. 10:27 + в цитатник
Никто уже и не помнит, с чего все началось, но интересно куда это все движется.
Возможно, кто-то уже изрек это до меня, но это не главное. Главное то, что существует болезнь, заразившись которой человек превращается в человека, который интеллектуально схож с бабушками, тяжело пережившими 90-е, и бездумно ругающие все, что есть сейчас происходит (и что в наше время… да колбаска… да по 25 копеек...)
Не важно, какую мы рассматриваем предметую область. Важно то, что ты, бабушка, меня веселишь до ужаса!

Пока большинство пользователей заняты поиском ASCII-HEX транслятора, моя ремарочка про систему, с которой имею честь работать уже много лет, будет вызывать много спорных вопросов. Системы DPI продуцируют смешанные чувства не только у меня, но и у нашего интернет-сообщества, порождая бесчисленные холивары и обсуждения. Может быть, данный пост еще немного приоткроет завесу, и расскажет о том, что мы двигаемся в нужном направлении. И не стоит ничего бояться, если 79 6f 75 20 61 72 65 20 6e 6f 74 20 68 69 64 69 6e 67 20 73 6f 6d 65 74 68 69 6e 67 20 3a 29

Мммм. Как же объяснить, мою мысль. Постараюсь быть максимально кратким и броским, как хищник, выуживающий свою лань. Поэтому статьи про описание функционала, архитектуру и прочую матчасть лучше изучить предварительно, лень описывать уже описанное. А продолжу о том, что человек не хочет/может воспринимать некоторые вещи, принимая их как данность. Во многом это обусловлено эффектом Даннинга-Крюгера, но не о нём речь. Другими словами, ты не замечаешь свою руку, пока она у тебя есть, но когда руки нет — тебя это тревожит.

Очень приятно, что ваш оператор предлагает вам услуги по напоминанию чего-либо (о чем-то вы могли забыть, денег закинуть на трубку, к примеру) редиректа, личного кабинета, онлайн-тарификации, ограничений скорости, защиты от сомнительных ресурсов вас и ваших детей, и пачки других весомых вещей.

From the other hand, очень неприятно, когда ваш оператор впаривает очевидную дичь предлагает к продаже крайне важную бизнес-логику, вроде ttl-идентификации (tethering), защиты от dns спуфинга, черных списков сайтов, безусловного редиректа.

Но давайте судить здраво. Давайте подойдем к анализу не с позиции абонента, а с позиции уравновешенного человека.

Пункты ЗА:


— Технический прогресс, большие объемы данных, динамично меняющаяся реальность и Semantic Web предлагают больший спектр возможностей для ведения бизнеса. Как бы не хотелось быть за мир во всем мире, бизнес направлен исключительно на извлечение прибыли. К сожалению/счастью, у тебя нет/есть бизнес и ты поймешь/недоумеваешь.

— Совокупность возможностей, имплементированных в одном устройстве, позволяет оператору таки не сдирать с абонента последнюю шкуру, а брать символические суммы, которые уже включены в стоимость тарифного плана. Тут же и удобство в управлении сетью в целом, что влечет за собой те самые пять девяток (99,999), что очень важно для современного человека-обывателя

— Возможность предоставлять еще больше услуг, на основе сигнатурного анализа, как-то CDN-сети, IPTV, оптимизация/подготовка контента

— Реальная помощь для силовых структур. Это не шутка. Смысла мало не использовать такой мощный инструмент для усиления бозопасностных flow.

-BigData, Статистика, KPI, ML, и много других страшных слов очень прожорливы до информации. Так как нам нечего скрывать, на перспективу это улучшит качество услуг.

Пункты ПРОТИВ:

— Конечно же обидно за принцип открытости в интернет. Базовая идея, на основе которой все зарождалось, теперь не существует.

— Конечно же неприятно, что «большой брат следит». Хотя для меня это вопрос веры, и не более.

— Конечно же неприятно, что обычные раньше вещи, теперь с трудом используются, требуют минимальных знаний в IT и спец-инструментария.

Ребят, нужное подчеркнуть.
Я за/против интеллектуальных систем управления потоками данных

Проголосовало 5 человек. Воздержалось 3 человека.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/231111/


Метки:  

[Перевод] Сказки, которые Вам расскажут облачные провайдеры

Вторник, 06 Июня 2017 г. 10:04 + в цитатник
image

Перевод этой статьи – наш вклад в ликвидацию безграмотности потребителей облачных услуг. Будьте бдительны!
Если вы задумываетесь о миграции в облако вот Вам несколько утверждений, которые при разговоре с облачным провайдером «маякнут» о том, что здесь что-то не так.

Ложь # 1: Все соглашения об уровне предоставления услуг (SLA) по использованию облачных сервисов одинаковы.
Это правда: многие провайдеры по умолчанию ставят цифру 99,95%, когда речь идет об уровне доступности. Но что нужно сделать, чтобы получить правдивые цифры?
Посмотрите на это следующим образом: отличная реклама подтолкнула Вас на покупку автомобиля, но при совершении сделки Вы обнаруживаете маленькую звёздочку рядом с процентной ставкой, обязывающую Вас сделать огромный первоначальный взнос. То же самое происходит с облачными SLA.
Например, облачный провайдер «A» может иметь SLA 99,95%, но когда вы выясняете всю подноготную, то получается, что этот SLA соответствует этому уровню только в том случае, если вы выполняете определенные действия. Например, вам, возможно, придется заключать контракты с провайдером «А» только в нескольких зонах доступности или покупать их в определенных аспектах своего решения (кстати, оба условия увеличивают ваши затраты). Это нормально только в том случае, если Вы так и планировали сделать.
С другой стороны, облачный провайдер «B», может дать вам SLA 99,95% без привязки к тексту: у вас просто есть SLA 99,95% на каждую виртуальную машину, а в договоре четко определён период. SLA полностью отвечает за них, и вам не нужно беспокоиться о том, чтобы изменить архитектуру вашей системы и приложений, которая будет охватываться SLA.
Поэтому, если кто-то скажет вам, что все облачные SLA одинаковы, достаньте лупу, там где-то может скрываться звездочка.

Ложь # 2: виртуальные машины (VM) гораздо проще в использовании, чем физические серверы.
Как и в любой лжи здесь есть доля правды. Так, например, виртуальную машину очень легко установить, и Вам не придётся проходить весь этот цикл с покупкой серверов и шкафов для них, установкой, налаживанием инфраструктуры для их деятельности. А так же, вы можете настроить операционную систему в одно мгновение.
Однако виртуальная машина — это просто пустой контейнер. После установки VM дальнейший процесс работы ничем не отличается от работы с физическим сервером. Вам все равно придется развернуть приложения, настроить свои ИТ-процессы и т. д.

Ложь # 3: Большинство компаний перемещают весь дата центр в облако.
Малые компании? Может быть. Средние и крупные компании? Нет. Они могут перемещать часть своего дата центра в облако, чтобы сделать некоторые ИТ-операции более гибкими и быстрыми, но это очень редко происходит со всем массивом данных.
Причина проста: чем крупнее компания, тем больше факторов, препятствующих переходу в облако она имеет: множество бизнес-единиц, устаревших систем, мэйнфреймов, уже существующих ЦОДов и сторонние интеграции. Некоторые используемые приложения могут работать неправильно в облаке. Некоторые данные могут быть слишком секретными, чтобы когда-либо существовать в облачной среде. Как результат: гибридная среда — это факт жизни.
Ложь # 4: Вы сэкономите массу денег в долгосрочной перспективе с облаком.
Могут ли компании сэкономить деньги, перейдя в облако? Конечно. Но экономия на затратах — это не главная причина, почему компании мигрируют в облако. Компании могут переходить туда, потому что облако дает им большую гибкость, более быструю реакцию ответа, а также возможность быстрее перейти от капитальных расходов к операционным, тем самым, сократив количество затрат необходимых при запуске проекта, и быстрее выйти на рынок. Иногда (я знаю, это звучит еретично!), затраты компании на облако действительно будут расти. В этих случаях задача компании заключается в том, чтобы взвесить расходы и преимущества, которое дает облако, чтобы увидеть, что представляет наибольшую ценность.

Ложь # 5: Мы позаботимся обо всем!
В самом деле? В таком случае, вы будете доставлять мне кофе по утрам?
Если вы услышите эту строку, немедленно спросите: «Что вы подразумеваете под «всем»?» Когда у вас есть четкое объяснение, предоставленное вам в документальном формате, сравните его с тем, что вы считаете «всем». Если они совпадут, вы можете продолжать сотрудничество. Если они отличаются, определите, что должно произойти, чтобы ваша интерпретация «все» была согласована с облачным провайдером.
Если вы вслепую принимаете заявление «Мы заботимся обо всем», я могу уверить вас, что у вас есть ложные ожидания и у вас будет плохой опыт сотрудничества с поставщиком облачных услуг.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330300/


Метки:  

Текстовый онлайн с фестиваля РИТ++ 2017. День второй

Вторник, 06 Июня 2017 г. 10:00 + в цитатник

Трансляция второго дня

Сегодня в этом посте весь день будет вестись текстовая трансляция фестиваля РИТ++ 2017, проходящей в Сколково 5 и 6 июня.

Если вы хотите смотреть видео из главного зала и включения из мобильной студии Хабрахабра, то вам на страницу видео трансляции. Если почитать онлайн и поообщаться в кооментариях — под кат.




Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330100/


Метки:  

WWDC 2017. Пошумим немножечко

Вторник, 06 Июня 2017 г. 09:51 + в цитатник


В этом году с нетерпением ждал WWDC. Хоть Apple и сидит на самой большой горе кэша в истории, конкуренты подпирают со всех сторон. Гугл с телефонами, Амазон с Алексой, Майкрософт с AR — в какой-то момент даже показалось, что Apple начинает догонять, а не лидировать. Но сегодняшний keynote вернул все на свои места.


Norm


Я дважды бывал на WWDC, в этот раз решил посмотреть из дома. Судя по всему, ошибся, эта конференция самая насыщенная за многие годы. Даже по тому, с какой скоростью начали анонсировать все фичи, было понятно, что покажут МНОГО. И ребята не подкачали.

Тут и новый iOS, и так долгожданное обновление макбуков и аймаков. И новый крутой iMac Pro всего за скромные 5000, новая макось, айпады, очень качественный AR, и HomePod. Сложно вспомнить более насыщенное событиями мероприятие от Apple. Про всякие новые фишки iOS и MacOS даже особо не интересно писать, почитайте на VC.

High


Вот, что реально привлекло внимание.
iPad с поддержкой 120Hz. Те, кто сидел за геймерскими мониторами, понимают разницу между 60 и 120 и знают, как ощутимо это меняет восприятие интерфейса. Очень правильный шаг. Пока Андройды не сделали тоже самое, iPad будет выглядеть как buttery smooth девайс. После него пользоваться другими устройствами будет тяжело. Очевидно, что в ближайшее время мы увидим эти же 120Hz на айфоне, так что ждем осени.



Новое железо. Наконец пришел запоздалый апдейт макбуков и аймаков, но этим не удивишь. А вот то что ребята взяли Mac Pro и запихнули его в корпус iMac — заслуживает уважения. Apple все-таки не хочет проигрывать гонку профессиональных десктоп-компьютеров, приложили максимум усилий. И слава богу, а то я уже думал Hackintosh собирать на основе PC компонентов. Потому как даже топовое железо тормозит, когда Gradle отжигает или Swift компилятор решает перебрать весь проект. Цена конская, но уверен, что хипстерские стартапы с оценками в несколько ярдов купят себе такие машины.


HomePod. Вполне логичный и ожидаемый ответ на Google Home и Amazon Echo. Интересно, насколько качественным будет звук в такой маленькой колонке. Посмотрим что напишут ревьюверы. Немного переживаю за ребят из Sonos, потому как Multi speaker room уже и Google, и Apple делают, а ребята все еще не выложили полноценный интеграции с сервисами. Ведь уже почти год ждем интеграции Sonos и Echo. Ну и возможность иметь Siri в доме с HomeKit это тоже очень удобно. Например, потому что Alexa и Google Home многими устройствами управляют через Web API, что лично у меня дома вызывает постоянные тормоза, когда просишь свет выключить. А вот HomeKit работает с ними напрямую, поэтому зачастую проще сказать Siri “Hey Siri, Dim the lights”.



ARKit. Самое вкусное и крутое. Что реально отличает его от конкурентов типа Google Tango — работает без всяких дополнительных сенсоров и будет доступен на сотнях миллионов устройств сразу. Это сильный punch в сторону Google, который работал над технологий Tango много лет, но так и не добился хоть какого-то малейшего распространения. Судя по демо, технология работает достаточно гладко и вызывает вау-эффект. Примерно как Minecraft на Hololens. Сотни применений технологии для игр, планировщиков квартир, Enterprise-решений ждут нас в ближайшем будущем.


Работаем дальше


Кстати, упор Apple на железо, Metal 2, ARKit и возможность подключения VR headset к Mac — очень интересный ход развития компании. Мне кажется, они по настоящему готовятся к новому типу AR устройства а-ля Magic Leap и для этого подгоняют весь окружающий стек технологий (железо, графические движки, Тулзы) и подготавливают аудиторию через промежуточный вариант ARKit.

Следующие 5-10 лет однозначно ожидается мощное движение в направлении какого-то нового способа потребления контента. Сегодняшней презентацией Apple показала, что они активно над этим работают. И уже есть, что показать.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330292/


Дайджест продуктового дизайна, май 2017

Вторник, 06 Июня 2017 г. 09:50 + в цитатник
Уже семь лет я публикую регулярные обзоры свежих статей по теме интерфейсов, новых инструментов и коллекций паттернов, интересных кейсов и исторических рассказов. Из лент нескольких сотен тематических подписок отбирается примерно 5% стоящих публикаций, которыми интересно поделиться. Предыдущие материалы: апрель 2010-апрель 2017.

Дайджест продуктового дизайна, май 2017

Паттерны и лучшие практики


Design Better Data Tables
Памятка Andrew Coyle по работе со сложными таблицами. Он наглядно перечисляет уйму полезных паттернов навигации, сортировки и фильтрации. Перевод.

Design Better Data Tables

Sliders, Knobs, and Matrices — Balancing Exploration and Precision
Page Laubheimer разбирает особенности использования ползунков, ручек переключения и двумерных матриц в интерфейсах. Для каких задач они уместны, как обеспечить комфортную работу с ними с разными устройствами ввода.

Sliders, Knobs, and Matrices — Balancing Exploration and Precision

Interactive Email Design Elements, Interactive Email Marketing
Отличный каталог паттернов современных интерактивных приёмов в почтовых рассылках. Правда, очень мало информации о том, насколько это поддержано почтовыми службами и клиентами, а это главная проблема во внедрении всех этих красивых идей. В продолжение темы:

Casey Winters Reveals How Pinterest Perfected User Onboarding
Бывший дизайнер Pinterest Casey Winters рассказывает о том, как устроен процесс встречи нового пользователя в продукте.

Casey Winters Reveals How Pinterest Perfected User Onboarding

В продолжение темы:

Hollywood Goodbyes and Focused Content
Интересный подход к упрощению существующих экранов интерфейса от Dave Riensche. Он определяет ключевые задачи страницы, а затем выписывает её текущие элементы и вычёркивает те, что не относятся к задаче. После этого ранжирует их по ценности и пересобирает экран без лишнего и с нужными акцентами.

Hollywood Goodbyes and Focused Content
Jessica Enders — Designing UX: FormsJessica Enders — Designing UX: Forms
В прошлом году издательство SitePoint выпустило книгу Jessica Enders «Designing UX: Forms». UXmatters публикует выдержку из неё, посвящённую проектированию общего сценария заполнения формы.


Best Practices for Long Scrolling
Николай Бабич описывает принципы проектирования добротных интерфейсов страниц с длинной прокруткой.

Best Practices for Long Scrolling

Ещё пара свежих статей от него:

Big Pictures on Small Screens
Советы Amy Schade из Nielsen/Norman Group о том, что делать с большими картинками в мобильной версии.

Исследования Baymard Institute

A Year of Google Maps & Apple Maps
Justin O’Beirne продолжил своё сравнение карт Google и Apple. В течение года он собирал скриншоты обновлений нескольких кусков востребованной территории.

Design principle: IKEA effect
Антон Николов описывает интерфейсный принцип IKEA — как вовлечь пользователей через несложные действия по настройке или заполнению личных данных.

Design avatars that make sense — and be more inclusive in the process
Michelle Venetucci Harvey разбирает разные способы представления аватаров по-умолчанию, когда неизвестен пол пользователя.

Anchors OK? Re-Assessing In-Page Links
Памятка Amy Schade из Nielsen/Norman Group по использованию ссылок-якорей внутри страницы. У них есть много потенциальных проблем и статья рассказывает, как избежать их.

Дизайн-системы и гайдлайны


Microsoft Fluent Design System
На конференции Build Microsoft показали следующее поколение дизайна Windows. Они назвали его дизайн-системой Fluent — она развивает текущий визуальный язык для того, чтобы объединить не только экранные интерфейсы, но и дополненную/виртуальную реальность. Если Material Design показал в своё время способ унификации для всего что имеет дисплей, то это следующий шаг в развитии визуальных языков.





Пока это просто одностраничник с рассказом об идеологии, плюс несколько новых страниц в гайдлайнах UWP (Universal Windows Platform). Но это и будет развитие UWP (уже есть шаблоны и тулкиты для многих дизайнерских инструментов — Sketch, Photoshop, Illustrator, XD и Framer). Интересно, как это отразится на дизайн-системе Office Fabric.

В начале года утекли скриншоты её ранней версии под кодовым названием Project Neon. Они показывали возвращение эффекта полупрозрачности из Windows Vista и добавление типографических акцентов. Видео-демонстрация подтверждает это направление. Помимо этого и без того удачная работа с интерфейсной анимацией, которую Microsoft переосмыслил в 2010 году и здорово повлиял на рынок, стала ещё более бодрой. А также принцип масштаба, который важен для дополненной и виртуальной реальности.

В своё время metro-дизайн изменил интерфейсы более современным и органичным для цифровой среды подходом и определил несколько ключевых принципов, которые подхватили Google и Apple — фокус на контенте вместо декора, особая роль анимации. Правда, мобильная Windows не смогла тягаться с лидерами, а десктопная упростила интерфейсные подходы в Windows 10. В новом поколении Microsoft добавил к своим изначальным идеям удачные мысли Material Design, так что новое поколение визуального языка должно стать ещё интереснее. Тем более, что с новым циклом обновлений раз в полгода это не останется пустым прожекторством, как часто случалось раньше.

Официальная группа в LinkedIn.

Android O
На конференции Google I/O презентовали обновления Android. Дизайн-команда компании отметила наиболее интересные выступления.

Google I/O 2017

Основные изменения технические, интерфейса касается всё что уже анонсировано раньше (наконец-то появились индикаторы обновлений на иконках приложений, новые эмоджи (не лучше старых), контекстные подсказки по работе с буфером обмена, улучшения области уведомлений). Теперь в платформу встроена упрощённая версия Tensor Flow, решающая задачи машинного обучения, очередное ускорение работы и уменьшение нагрузки на батарейку, новый мощный движок для 3D-графики. Самое приятное — в стандартные библиотеки добавлены многие стандартные анимации. Можно поставить бета-версию Android O.

Появились библиотеки компонентов Material Design и онлайн-обучалки по их использованию: Android, iOS и веб. В офисе Google собрали большую рабочую сессию с толковыми местными дизайнерами, которые предложили много концептов приложений. Кстати, платформа используется уже на 2 миллиардах устройств.

Интересно, что Google в фоновом режиме экспериментирует над версией Android, сделанном не на базе Linux. Она называется Fuchsia и недавно утекли экраны её интерфейса. Никаких планов и сроков по её поводу нет, поэтому картинки скорее для того, чтобы быть в курсе.

Дизайн-система России
Инициативная группа «Дизайн государственных систем» показала первые части дизайн-системы, которая должна унифицировать сайты государственных организаций.

Illustrating a more human brand, part 2
Продолжение эпической статьи дизайн-команды Dropbox об эволюции их стиля иллюстраций. Вторая часть описывает рождение текущего подхода.

Illustrating a more human brand, part 2

В продолжение темы:

Samsung Design
Сайт достаточно сильно обновился.

The Path to Design System Maturity
Christian Beck описывает своё видение уровней зрелости дизайн-системы: унификация на уровне макетов, унификация всей коммуникации продукта, унификация кода.

Style Guide Guide by Brad Frost
Brad Frost сделал шаблон-заглушку для описания несложной дизайн-системы. Она предлагает типовую структуру для описания переменных, элементов и компонентов.

Понимание пользователя


The Illusion of Measuring What Customers Want
Шикарнейший разбор ограничений измерения UX от Alan Klement. Несмотря на то, что популярные измерения на базе шкалы Ликерта выражаются в цифрах, это качественные, а не количественные данные, и их нужно использовать для расчётов с осторожностью.

The Illusion of Measuring What Customers Want

Creating Personas — A guide, not a template
Интересный формат описания персонажей от Ben Ralph, учитывающий достаточно много деталей. Правда, мало кто из этих статей решает проблему использования персонажей после их создания.

Ben Ralph — Persona Notepad

В продолжение темы:

Нир Эяль — На крючкеНир Эяль — На крючке
Издательство Манн, Иванов, Фербер выпускает русский перевод книги Nir Eyal «Hooked».


Contemporary morality — Moral judgments in digital contexts
Занятное пользовательско-психологическое исследование — около 1000 человек предложили решить морально-этические проблемы, пользуясь телефоном или компьютером. Пользователи телефонов делали лучший моральный выбор. Краткие выводы из исследования.

Design for Fingers, Touch, and People, part 2
Продолжение новой редакции статьи Steven Hoober о том, как пользователи работают с мобильными телефонами.

Jonathan Shariat & Cynthia Savard — The Tragic Design Book
Вышла книга Jonathan Shariat и Cynthia Savard, посвящённая трагическим ситуациям в жизни, где дизайнеры не подумали и сделали ситуацию только хуже.

Информационная архитектура, концептуальное проектирование, контент-стратегия


The 5 Steps of Successful Customer Journey Mapping
Толковая пошаговая инструкция Kate Kaplan по составлению customer journey map. Это пять этапов по сбору инициативной группы, проведению исследований и созданию самой карты.

Проектирование и дизайн экранов интерфейса


Framer Design
Framer переосмыслили инструмент и добавили туда свой Sketch. Теперь это полноценный продукт для дизайна и прототипирования с переключением между этими двумя режимами. Видео-демонстрация. Другие новости инструмента:





Sketch 44
В новой версии появилась возможность более точно задать поведение элементов при адаптивности — к каким краям он залипает, как тянется по вертикали и горизонтали. Это работает и для объектов, и для артбордов (у которых появилась возможность быстро переключить размер). Возможно, это сделает Auto Layout не нужным, ведь он часто сбивает размеры и отступы между элементами. Также появилась возможность заменить недостающие шрифты, комментировать макеты в Sketch Cloud, обновились шаблоны для iOS. Перевод.

Sketch 44

Свежие плагины и инструкции:
  • Michael Spiegel показывает, как с помощью переопределения параметров копии символа можно раскрашивать набор иконок.
  • Mirr — ещё один плагин, позволяющий собрать простой интерактивный прототип прямо в Sketch.

Ludus
Браузерный графический редактор. Интересная особенность — можно импортировать материалы из сторонних сервисов — например, прототипы Framer или скрипты на CodePen.





Storyframes before wireframes — Starting designs in the text editor
Fabricio Teixeira описывает метод проектирования страниц storyframing. Вместо создания привычных wireframes, промо-сайт или подобная страница описывается кратким повествовательным текстом, включающим основные посылы, которые компания хочет донести до пользователя.

C4Studio

InVision

Adobe XD

Figma

Flinto





Пользовательские исследования и тестирование, аналитика


Group Notetaking for User Research
Отличная методичка по групповому ведению заметок в ходе сессий юзабилити-тестирования, на которые ходит вся продуктовая команда — в таком формате эффективность полученных знаний для изменений в продукте гораздо больше. Описание процесса, шаблоны документов, подводные камни.

Group Notetaking for User Research

Как работать с аналитикой, если вы дизайнер
Наталья Бабаева из издательства МИФ показывает, как дизайнеру эффективно взаимодействовать с аналитиком для улучшения интерфейсов. Она показывает примерные шаги «взросления» диалога от получения бесполезных цифр до продуктивной работы через гипотезы.

5 Techniques to Identify Clusters In Your Data
Jeff Sauro разбирает пять основных техник кластеризации данных пользовательских исследований.

Ambient Research
Gregg Bernstein из Vox Media рассказывает о том, как они делают результаты пользовательских исследований постоянно доступными и наглядными всей продуктовой команде. Благодаря тому, что они всегда на виду, их инсайтами пользуются чаще.

Визуальное программирование и дизайн в браузере


A Better Way to Code
Сумасшедший пример визуального программирования от Mike Bostock, создателя популярнейшей библиотеки d3.js для визуализации данных. Он запустил d3.express, среду разработки и аналитики одновременно, которая позволяет пошагово перебирать и визуализировать данные — в таком формате работа по анализу радикально меняет свой формат.

A Better Way to Code

Новые скрипты

Flexbox и CSS Grid

Работа с SVG

Веб-типографика


Метрики и ROI


Business Software UX & NPS Benchmarks
Jeff Sauro провёл исследование показателей NPS и SUS для дюжины известных productivity-сервисов. Отчёт платный и достаточно дорогой, но в статье есть основные выводы.

UX-стратегия и менеджмент


UX-стратегия. Часть 6 — Внедрение
Шестая, финальная статья в серии про UX-стратегию на практике. Она посвящена осуществлению изменений в продуктах и компании. Это расширенная и доработанная версия презентации.

Мало совершить подвиг в виде удачного редизайна устаревшего сервиса — нужно обеспечить повторяемость хороших результатов. Поэтому нужно думать о перестройке социо-технической системы, а не просто обновлении нескольких экранов. Причина плохих продуктов — это плохая машина, которая их производит, так что чинить нужно в первую очередь её. Шестая часть строится на идее паттернов дизайн-менеджмента и активно ссылается на предыдущие.

UX-стратегия. Часть 6 — Внедрение

После выхода английской версии займусь двумя вещами:

  • Книга по дизайн-менеджменту на основе серии. В ней будет переработана структура, добавлено много примеров и раскрыты чуть менее масштабные темы, которые не попали в основные 6 частей.
  • Инструмент для оценки зрелости вашей компании и рекомендации по дальнейшим шагам. В серии статей вырисовалось что-то вроде собственного метода, попробую формализовать его.


Product Design Exercises We Use At WeWork Interviews
Хорошие примеры тестовых заданий от дизайн-команды WeWork. В них удачно описана проблематика и поставлены ограничения.

A New UX Maturity Model
Natalie Hanson предлагает свою модель зрелости UX. В ней дизайн в компании развивается от не очень осмысленного к фокусу сначала на визуальной консистентности, потом на качестве пользовательского взаимодействия и в конце — целостной карте взаимодействия по всем каналам.

Natalie Hanson — UX Maturity Model

В продолжение темы:
  • Jeff Sauro готовит свою модель зрелости UX. Для этого он проанализировал существующие модели, составил опросник на их основе и запустил на сотню компаний. Результаты будут опубликованы позже.

How to jump-start recruiting in hard-to-staff contexts
Советы по найму и развитию дизайнеров от главы продуктового дизайна Facebook Margaret Gould Stewart.

How IBM Trains Design Thinking Facilitators
Ann F. Novelli рассказывает, как IBM тренирует фасилитаторов для распространения практик дизайн-мышления по всей компании. Это стало одной из ключевых идей масштабирования дизайна.

How IBM Trains Design Thinking Facilitators

UX & Agile: Dream Team or Odd Couple?
Тема интеграции UX-практик в гибкий процесс разработки уже избита, но Paul McInerney из IBM неплохо структурировал опыт компании.

How Intercom brings play into their design process
Глава дизайна бренда Intercom Stewart Scott-Curran рассказывает, как работает его команда. В продолжение темы:


Продуктовый менеджмент и аналитика


Translating UX Goals into Analytics Measurement Plans
Aurora Harley из Nielsen/Norman Group показывает, как перевести интерфейсные вопросы на язык аналитики и настроить отслеживание нужных метрик.

Product discovery: Making progress towards the innovation land — Interview with Nikkel Blaase
Интервью с Nikkel Blaase из XING о получении продуктовых инсайтов от пользователей, которые помогают нащупать инновационные решения.

Методологии, процедуры, стандарты


Джейк Кнапп — Спринт: Как разработать и протестировать новый продукт всего за пять днейДжейк Кнапп — Спринт: Как разработать и протестировать новый продукт всего за пять дней
Издательство Альпина выпустило русский перевод книги про Design Sprints от Google Ventures.


Prototyping IBM Design Thinking Method Cards
Eric Morrow рассказывает, как IBM сделали игральные карты по дизайн-мышлению, которые помогают в проведении сессий ко-дизайна. Они планируют разложить их во всех переговорных, чтобы любые команды могли улучшить рабочие обсуждения. Правда, продолжение статьи водянистое.

Конструктор опыта
ИКРА и Одноклассники запустили методичку, которая собрала уйму методов решения проблем и затыков в работе над цифровыми продуктами. Это как полезные практики, так и просто упражнения для разминки.

Кейсы


Непрошенные редизайны


История


Reissue of the IBM Graphic Standards Manual by Paul Rand
Группа энтузиастов собирается перевыпустить классические гайдлайны IBM от Paul Rand. За €30 можно получить печатное издание одного из лучших визуальных языков.

Тренды


The 5 Principles of IoT UX Design
Принципы дизайна интерфейсов для интернета вещей от Jared Porcenaluk. Толково расставлены акценты — эти интерфейсы утилитарны и не должны требовать слишком много внимания.

Designing Voice Experiences
Обзор процесса проектирования голосовых интерфейсов от Lyndon Cerejo. Тональность и сценарии, обработка ошибок и отхождений от плана, лучшие практики.

Алгоритмический дизайн

Умные часы и браслеты


Для общего и профессионального развития


Ten Principles of Good Design (2017 Tech Industry Edition)
Tobias van Schneider обновил принципы дизайна Dieter Rams в соответствии с реалиями современного интернета.

Can Digital Products Be «Timeless?»
Adam Kopec из Hodinkee рассуждает на тему того, могут ли цифровые продукты иметь дизайн в духе нестареющей классики из мира физических предметов (например, Porsche 911). Изменения цифровых продуктов происходят так быстро и часто, что стили и модели работы с продуктами постоянно меняются. Парочка таких примеров есть — главная страница Google и новостная лента Facebook.

Re-finding Your Individual Contributor Self
Erin Malone размышляет на тему того, как дизайн-менеджеру не забыть работу руками и не отрываться от реальных продуктовых дел. Она пытается восстановить навыки и делится опытом.

Люди и компании в отрасли


AMA: 2ГИС
Интервью с дизайн-командой 2ГИС на основе AMA. Новосибирский картографический сервис успешен в продуктовом плане и много времени уделяет развитию дизайна основного продукта, а также делает множественные экспериментальные приложения. Несколько лет назад они показали пример того, как можно сравнительно простыми средствами получить собственный шрифт. Кроме того, они организуют конференцию CodeFest в Новосибирске и поддерживают Серебро Набора, посвящённую типографике.

AMA: 2ГИС

Women Who Design
Сайт-каталог женщин-дизайнеров в Twitter. Как и для чего он делался.

The Slash Workers
Опрос 300 фрилансеров на тему особенностей их работы и видения карьеры от компании And Co. Правда, как обычно не факт что релевантно для нашего рынка — 70% ответивших из США.

Freelance.tv
Dann Petty готовит фильм о дизайнерах-фрилансерах. Для этого он объездил Америку на микроавтобусе и записал кучу интервью с известными фрилансерами.

IA, Rosenfeld Media, and EUX — An Interview with Louis Rosenfeld
Интервью с Louis Rosenfeld, в котором он рассказывает о переходе от работы над проектами к развитию профессии в целом — они расширяют издательскую деятельность Rosenfeld Media и анонсируют новые конференции.

Interface Lovers
Сайт публикует интервью с продуктовыми дизайнерами.

Материалы конференций


Agile UX Virtual Summit
UXPin и Rosenfeld Media проводят бесплатную онлайн-конференцию 13-16 июня. Снова достаточно мощный состав выступающих: John Zeratsky, Indi Young, Peter Merholz, Carol Smith, Josh Seiden и другие.

Design Ops Summit
Конференция по дизайн-менеджменту и UX-стратегии от Rosenfeld Media, которая пройдёт в Нью-Йорке 6-8 ноября.

UXSTRAT USA 2016
Обзор трёх презентаций с американской части конференции UXSTRAT 2016 от Krispian Emert — она проходила 14-16 сентября в Providence, США.

Подписывайтесь на рассылку! Письмо приходит один раз в месяц.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/329952/


Метки:  

[Перевод] Развертывание Redmine с помощью Capistrano

Вторник, 06 Июня 2017 г. 08:28 + в цитатник


Это вторая часть моего руководства о том, как самостоятельно администрировать Redmine в долгосрочной перспективе. Первая часть была посвящена управлению собственной версией Redmine с помощью Git (ссылка на перевод).


Имея собственный репозиторий Redmine, пришло время ...


Автоматизировать развертывание


Серьезно. Не пытайтесь развернуть старомодным способом, копируя всё вручную.


Автоматизация развертывания — это однократное вложение, окупающееся сэкономленным временем и усилиями каждый раз, когда нужно (ну, или приходится) обновить Redmine. Цель автоматизации — сделать последующие развертывания максимально легкими. Даже самое незначительное исправление или улучшение может быть выполнено мгновенно, потому что автоматизированная процедура обновления быстра, надежна и может быть запущена одной командой.


Я прошу вас научиться тому, как «профи» (то есть люди, которые зарабатывают на жизнь тем, что разрабатывают и запускают Rails-приложения, развертывают свои системы. И неважно, кто вы — локальный администратор сервера или разработчик Python, которому поручено поддерживать Redmine в организации. За прошедшие годы много умных людей потратили кучу времени на разработку набора инструментов, который после установки одним легким нажатием клавиши сокращает время простоя Rails-приложений до нуля. Такие инструменты существуют, ими просто нужно воспользоваться. И вполне возможно, вы узнаете пару новых фокусов, которые пригодятся вне контекста Redmine.


Capistrano


Capistranoудаленный многосерверный инструмент автоматизации — идеальный выбор, когда дело доходит до автоматизации развертывания. Он внедрен в Ruby, но не ограничен развертыванием Ruby- или Rails-приложений. С помощью Capistrano реально автоматизировать все действия, производящиеся в SSH. И это можно осуществить на любом количестве серверов параллельно. Как Chef предназначен для развертывания серверов, Capistrano предназначен для развертывания систем, но им гораздо проще пользоваться.


Я привожу очень краткое введение в специфику Redmine, прочитать подробнее можно на capistranorb.com. Readme для этого — хорошая отправная точка.


Установка Capistrano


В ветке Redmine local/x.y-stable создайте файл с именем Gemfile.local. Это позволит удержать любые gems локальными по отношению к частной установке Redmine.


Gemfile.local


group :development do
  # uncomment if you're using modern (and secure!) ed25519 ssh keys
  # gem 'net-ssh', '4.0.0.alpha2'
  gem 'capistrano', '~> 3.4.0'
  gem 'capistrano-rails', require: false
end

После создания этого файла запустите команду bundle install и добавьте/зафиксируйте как файл Gemfile.local, так и появившийся Gemfile.lock.


Теперь запустите команду bundle exec cap install чтобы настроить Capistrano. Это добавит несколько новых файлов: config/deploy.rb и два файла в каталоге config/deploy/, которые соответствуют двум целевым установкам (или "stages""стадиям") по умолчанию. Если у вас есть отдельная установка Redmine для тестирования, например, новых плагинов, то это будет ваша "staging target", в то время как живая (рабочая) stage — это производство. Основная идея состоит в том, что всё общее идет в deploy.rb, а отличающееся для разных stage— в соответствующие файлы в каталоге config/deploy. Чаще всего здесь указывается только целевой хост и, возможно, настраивается другая ветвь git или имя пользователя для развертывания.


Базовая установка Capistrano для Redmine


Вот как может выглядеть минимальная конфигурация Capistrano:


config/deploy.rb


# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'redmine'

set :scm, :git
set :repo_url, 'git@code.yourcompany.com:redmine.git'

# Target directory in the server.
# Should exist and the user account you're using for deployment should
# have write access.
set :deploy_to, '/srv/webapps/redmine'

set :pty, true
set :log_level, :info

# Linked files are expected to exist below /srv/webapps/redmine/shared and will be
# symlinked into the deployed # code. Create them either manually or through an
# automation tool like chef. The reason for doing so is to not keep database
# credentials and server secrets in your git repository.
set :linked_files, fetch(:linked_files, []).push('config/database.yml',
                                                 'config/secrets.yml')

# Directories with contents you want to keep across deployments are declared here. 
# Most important is files where Redmine stores any uploaded files.
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp',
                                               'vendor/bundle', 'files')

# keep the last 5 deployed versions on the server.
# Useful in case you have to revert to an older version.
set :keep_releases, 5

namespace :deploy do

  # Declares a task to be executed once the new code is on the server.
  after :updated, :plugin_assets do
    on roles(:app) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          # Copy over plugin assets
          execute :rake, 'redmine:plugins:assets'
          # Run plugin migrations
          execute :rake, 'redmine:plugins:migrate'
        end
      end
    end
  end

  # This will run after the deployment finished and is used to reload
  # the application. You most probably have to change that depending on
  # your server setup.
  after :published, :restart do
    on roles(:app) do
      sudo "/etc/init.d/unicorn reload redmine"
    end
  end

  # cleans up old versions on the server (keeping the number of releases
  # configured above)
  after :finished, 'deploy:cleanup'
end

Остается только настроить сервер, на который вы собираетесь развертывать, пользователя Capistrano для входа на этот сервер и ветвь для развертывания:


config/deploy/production.rb


set :branch, 'local/3.2-stable'
server 'redmine.yourcompany.com', user: 'deploy', roles: %w{web app db}

Если вы используете одну и ту же машину для тестирования и производства, просто перенесите параметр deploy_to в файлы конфигурации stage, чтобы иметь возможность установить отдельный каталог для каждого stage. Не забудьте добавить и зафиксировать Gemfile.local, Gemfile.lock и конфигурацию Capistrano, которую вы только что настроили. Эти файлы — часть кастомного Redmine и должны быть сохранены вместе с ним в системе управления версиями.


Если вы используете подмодули Git для добавления плагинов или тем для Redmine, обратите внимание на стратегию субмодулей Git для Capistrano, чтобы автоматически разворачивать и их.


Аутентификация


Capistrano использует SSH и полагается на правильно настроенную аутентификацию на основе ключей. Это также очень удобно при использовании какого-либо агента SSH или перенаправления агентов для доступа к репозиторию git через сервер развертывания со своим локальным ключом.


Обязательно прочтите главу «Аутентификация и авторизация» в руководстве по Capistrano.


Запустить!


Теперь, когда всё на месте, пришло время для первого развертывания:


$ bundle exec cap production deploy

Если вы настроили все правильно, эта команда совершит развертывание Redmine за вас. Обычно неудачи случаются из-за проблем с разрешениями или аутентификацией, но в большинстве случаев их легко исправить.


Ссылки


  1. Deploying Redmine with Capistrano.
  2. Deploy and maintain Redmine the right way.
  3. Развертывание и сопровождение Redmine, правильный путь.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330210/


Метки:  

Добавляем в jsx циклы и условия

Вторник, 06 Июня 2017 г. 08:16 + в цитатник
Если вы используете библиотеку React, то наверняка используете и jsx. Конечно, это не обязательно, и можно писать только js, используя React.createElement, но с jsx получится гораздо лаконичнее, что повышает читаемость. И всё замечательно до появления первой необходимости вывести данные в цикле. В jsx циклы не предусмотрены. Зато предусмотрена вставка js-кода. И тут вновь возникает вопрос читаемости, но теперь она значительно ухудшается. Возникает ситуация, когда в js-коде пишется html, в котором пишется js-код с html. Конечно, можно выделить html в отдельную функцию. Но тогда html будет появляться в коде то тут, то там. А хотелось бы локализовать всё в одном месте. К счастью, в современном javascript почти для любой проблемы, есть решение в виде библиотеки или плагина. Выше обозначенную проблему легко решает плагин для babel transform-react-statements.



Цикл For



Принцип действия плагина прост. Плагин преобразует jsx-компоненты, такие как , в js-код. Допустим есть вот такой компонент:

const MyComponent = props =>
    
  • {item.text}

После обработки плагином, получим:

var _this = this;
 
const MyComponent = props =>
    
    {Array.prototype.map.call(props.items, function (item, index) { return
  • {item.text}
  • ; }, _this)}
;


Теперь подробнее о For. В первую очередь атрибут in. Это обязательный атрибут, в котором обозначается способ получения итерируемого объекта (например, переменная). Значение должно быть выражением, т.е. заключено в фигурные скобки.
Атрибут each
задает имя переменной для каждого элемента массива. Он не является обязательным. В случае его отсутствия, элементы массива будут передаваться в качестве spread-атрибута.


Преобразуется в:

{Array.prototype.map.call(items, function (value, index) { return ; }, this)}


Также, как видно из примеров выше, в цикле доступен номер элемента в переменной index. Переменную можно переименовать с помощью атрибута counter:


    
{ cell.content }


Атрибут key



Для корректной работы React, каждый элемент в массивах должен иметь атрибут key. Его можно указать очевидно, как в примере выше. Другой способ - использовать атрибут key-is. Это может немного улучшить читаемость. Также можно указать keyIs в параметрах плагина. Тогда key не нужно будет писать в шаблоне - логика его получения уходит в бизнес-логику.

.babelrc
{
    plugins: [["transform-react-statements", { keyIs: "id" }]]
}


{ item.value }
{ item.value }
{ item.value }

Будет преобразовано в:

{Array.prototype.map.call(array, function (item) { // key берется из параметров плагина return
{item.value}
; }, this)} {Array.prototype.map.call(array, function (item) { // key - из атрибута return
{item.value}
; }, this)} {Array.prototype.map.call(array, function (item) { // стандартный для React способ return
{item.value}
; }, this)}
;


Условие If



Это просто альтернатива для синтаксиса:

{ condition && }


Основная задача сделать всё в едином, html-подобном стиле. Есть два атрибута: либо true, либо false, проверяющие условие на истинность или ложность соответственно. Для нескольких дочерних элементов, условие будет применяться к каждому из них:

Текст 1
Текст 2


Преобразуется в:
{ !someCondition &&
Текст 1
} { !someCondition &&
Текст 2
}


Switch..Case..Default



Switch ведёт себя также, как и в javascript. У компонента Switch есть атрибут value, значение которого должно быть выражением в фигурных скобках, и дочерние компоненты Case, со своими атрибутами value. Если значение не соответствует ни одному из значений Case, выводится блок Default. Если блок Default отсутствует, возвращается null.
Text 1
Text 2
Text 3
Default text


Component



Довольно специфическое выражение. Превращает содержимое в стрелочную функцию:


       
text

Преобразуется в

props => 
text
;


Соответственно, внутри доступна переменная props, которую можно переопределить через атрибут props:


    

На выходе получим:

item => 
;


Автоматическое обертывание



Предположим, есть такой компонент:

class MyComponent extends React.Component {
    render() {
        return 
            
{item.text}
} }


For будет преобразован в выражение, возвращающее массив. Однако метод render должен вернуть React-элемент. Для того, чтобы использовать такой компонент, цикл нужно обернуть в элемент. Например так:

class MyComponent extends React.Component {
    render() {
        return 
{item.text}
} }


Но делать это не обязательно. Так как плагин сам обернёт массив в react-элемент. По умолчанию, это . Такое поведение можно изменить, указав параметр wrapper в настройках плагина:

{
    plugins: [["transform-react-statements", { wrapper: '
' }]] }


Также можно отключить автоматическое обёртывание, используя значение параметра no-wrap:

{
    plugins: [["transform-react-statements", { wrapper: "no-wrap" }]]
}


Отключение и переименование выражений



Допустим, что в проекте уже есть компонент , который вполне справляется со своей задачей. Тогда его можно отключить с помощью параметра disabled:

{
    plugins: [["transform-react-statements", { disabled: ["If"]}]]
}


Или можно переименовать выражение, чтобы в jsx использовать другое имя, например, IfStatement:

{
    plugins: [["transform-react-statements", { rename: { "If": "IfStatement" } }]]
}


Код пишется для людей, поэтому так важна его читаемость. И читаемость является главной проблемой jsx, а конкретно - перемешивание двух языков. Как видно, эта проблема решается, и решается она благодаря гибкости jsx в возможности вставлять javascript-код.

P.S. Автору было бы приятно получить звездочек на github, в качестве благодарности за работу.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330172/


Метки:  

Советы для инженеров от менеджера Google

Вторник, 06 Июня 2017 г. 07:00 + в цитатник
Всем привет!

Меня зовут Лариса. Я работаю в Google и веду блог на larrr.com, где я изначально и опубликовала эту статью.

Сегодня я предлагаю вашему вниманию статью, которая изначально была написана исключительно для внутреннего пользования Google. Мне очень понравилась, так что я связалась с автором, с ее разрешения я ее немного переделала, и получила разрешение от Google Press на публикацию. Перевод мой.

На всякий случай – это не официальный Google документ, и Google не несет ответственности за его содержание. Он субъективный, и написан сотрудником для сотрудников.

Советы для инженеров
15 апреля 2013
Отредактировано 21 мая 2014
Переведено 31 августа 2015
Gretta Bartels, Software Engineering Manager at Google


Уважаемый читатель,

В этом документе я описала некоторые принципы, на которые я опираюсь в работе со своими командами. В них нет ничего принципиально нового или революционного, все эти принципы давно известны каждому из нас. Но знать и делать – это две разные вещи. Поэтому этот документ также является напоминанием и для меня самой о том, что моя работа менеджера заключается том числе и в том, чтобы самой следовать этим принципам, и напоминать о них другим.

Один из моих более опытных коллег научил меня тому, что для менеджера очень важно быть предельно предсказуемым. У менеджера должен быть какой-то набор простых правил, о которых знают все его подчиненные, и которым они могут следовать даже когда менеджера рядом нет. Поэтому моя цель – чтобы программисты в моей команде могли задать сами себе вопрос “Что бы на это сказала мой менеджер?”, и сами себе на него правильно ответить. Тогда команда сможет работать практически самостоятельно, без моего руководства. А я буду сидеть дома и кушать пирожные :).

Вот список моих основных правил:

1. Занимайтесь той работой, которая действительно важна

1a) Всегда задавайте себе вопрос “Почему мы это делаем?”

Что бы вы не делали, все всегда должны четко знать две вещи – 1) почему вы это делаете? 2) как вы поймете, что достигли нужного результата? Даже если вам кажется, что вы можете ответить себе за вопрос “почему?”, не останавливайтесь на первом подходящем ответе, смотрите глубже. Задавайте себе этот вопрос снова и снова, пока ответ не будет простым, очевидным и одновременно с этим довольно масштабным.

Это чем-то похоже на метод “5 почему”, когда техних несколько раз задает себе вопрос “почему?”, углубляясь в ответ чтобы найти причину неполадки. Но в нашем случае я предлагаю использовать этот метод для любой работы, а не только для нахождения причин проблем.

А вот вам и пример из жизни. Одна из моих команд сейчас работает над улучшением качества данных для Google Maps (а именно – находим и устраняем внутренние противоречия в данных). В это случае “почему”-цепочка может выглядеть примерно так:

Мы устраняем противоречия в данных
-> для того, чтобы мы могли проще и быстрее интегрировать существующие и новые данные
-> для того, чтобы мы могли обновлять данные быстрее
-> для того, чтобы Google Maps были максимально точными
-> для того, чтобы качество Google Maps соотвествовало очень высокому стандарту и требованиям пользователей
-> для того, чтобы люди активно пользовались и доверяли Google Maps (и продуктам Google в целом)

Выглядит довольно просто, не так ли? Но исходя из моего опыта, далеко не все инженеры задают себе эти вопросы и видят дальше конктретной и обособленной задачи над которой они работают.

На самом деле понимать “почему?” для своей работы очень важно. Кричитески важно, я бы сказала.

  • Без этого понимания намного сложнее оценивать результаты своих трудов. И намного сложнее адаптироваться к постоянно меняющимся требованиям проекта, в результате которых вам может потребоваться доказывать менеджменту что то, что вы делаете, действительно важно.
  • К тому же, так вы сможете найти других людей и команды, которые преследуют ту же самую фундаментальную цель. Вы сможете найти поддержку и союзников, важность которых очень сложно переоценить.
  • Плюс, вы сможете лучше приоритизировать уже имеющиеся проекты.


Кстати, ответов на ваши “почему?” может быть несколько. Это хороший знак – вероятно, ваш проект действительно важен.

И еще важное, особенно для менеджеров: используя “почему”-цепочку, вы не только сможете лучше понять зачем вы что-то делаете и как делать это лучше, но и увидеть другие стратегические области развития для ваших проектов. Просто пройдите с другого конца цепочки и задайте себе вопрос “как?”.
1b) Самое важное – это результат

Как менеджер, я оцениваю своих сотрудников по следующим параметрам: Знания и Опыт, Сложность, Лидерство и Результаты. Хоть и все они важны для профессионального развития и карьерного роста, один из параметров значительно важнее прочих. Это – Результат.

Большинство компаний – это не обучающе-развивающие площадки для программистов. Это – бизнесы, которые работают, и именно благодаря этому в них можем работать мы. Кстати, лично мне это сочетание – бизнес и технология – очень нравится. Мне нравится работать над вещами, которые изменяют мир. И многим инженерам с которыми я общалась на эту тему – тоже.

Любопытно, что Результат вовсе не следует из остальных параметров. Можно быть умным, опытным, знающим свое дело харизматичным менеджером или техлидом команды, которая работает над невероятно сложной и интересной задачей. Задачей, которая не имеет вообще никакого стратегически важного значения. С другой стороны, вряд ли возможно создать что-то стоящее не обладая знаниями, или не будучи хорошим руководителем.

Кстати, насчет сложности. Бывает, что для достижения важного результата не надо делать ничего сложного. Это нормально. Всегда ищите и берите простые и одновременно важные проекты, когда вам предоставится такая возможность.

1c) Планы бесполезны, но важны

Я верю в OKR (сокр. Objectives and Key Results — цели и ключевые результаты — метод, используемый в современном менеджменте для управления проектами. Позволяет синхронизировать командные и индивидуальные цели и обеспечить эффективный контроль за реализацией поставленных задач. Wiki.). Я прошу всех инженеров в своих командах писать и оценивать их ежеквартально.

У письменной постановки целей есть много преимуществ. Но я думаю, что самая важная вот эта: ваше время ограничено, и вы должны занять его вещами, которые принесут больше всего пользы. К тому же они позволяют существенно улучшить качество планиромания. Без стратегического планирования вы легко можете попасть в две очень распространенные ловушки: переоценить то, сколько вы можете сделать за квартал, и утонуть в срочных делах вместо важных. Впрочем, с планированием вы тоже можете в них попасть, но вам будет намного проще их распознать и из них выбраться.

Ситуация, когда вы занимаетесь срочными вещами вместо того, чтобы заниматься важными, знакома многим. Вот в этой статье эта тема неплохо раскрыта. Почитайте, если вам интересно.

Еще более интересная проблема – это переоценка своих возможностей. Как менеджеру, мне регулярно приходится помогать инженерам быть более аккуратными в своих оценках – по моему опыту очень многие сильно переоценивают количество работы, которую они могут сделать за данный промежуток времени. Бывали случаи, когда люди ставили много целей, делали каждую на 30-50%, но не довели ни одной цели до запланированного результата. Намного лучше бы было сделать две или три цели на 100%.

Используя письменное планирование и оценивая свои результаты по прошествии квартала, многие могут существенно улучшить свои навыки постановки и достижения целей. Даже существенно не изменяя свою продуктивность, они начинают делать более реалистичные прогнозы и доводят несколько действительно важных вещей до конца. Именно поэтому я считаю OKR невероятно важными для своих команд, и надеюсь что как можно больше людей освоит этот навык.

2. Не теряйте время даром

2a) Ускоряйтесь (aka Как насчет парочки тестов?)

Во время моей учебы в университете, в качестве зачетной работы мне надо было написать игру Boggle с красивым интерфейсом и поддержкой для удаленной игры нескольких пользователей. Естественно, я даже пальцем не шевельнула до последнего дня перед сдачей. В 3 часа ночи я обнаружила что моя наскоро написанная программа содержит баг, который вылезал под самый конец игры.

Так что остаток ночи я провела играя в свою игру, пытаясь повторить баг и найти его причину. Конечно же, это было как минимум глупо. Мне просто надо было установить таймер игры на 5 секунд и дело пошло бы намного быстрее. В свое оправдание я хочу сказать, что дело было под утро, мне очень хотелось спать, а не искать ошибки в моей программе. Еще лучше было бы написать тест, но тогда я про тесты даже не слышала.

Каждый раз, когда вы повторяете какой-то кусок программы снова и снова, пытаясь найти ошибку и исправить ее, сделайте все, чтобы эти повторы были максимально короткими. Скорее всего это покажется вам лишним, так как вы будете уверены, что нашли ошибку с первого раза. Но так бывает очень редко. Вероятно, скоро вы поймете, что это не оно, и вам придется повторить процесс сначала. И потом еще раз.

Поэтому при работе над любым проектом постарайтесь сделать так, чтобы он максимально просто тестировался. Сделайте его модульным, сделайте так, чтобы любую часть программы можно было максимально просто изолировать и протестировать. Поверьте, настанет момент, когда вы будете рады, что сделали это. И если у вас возникнут проблемы с модульностью и изоляцией, то это хороший повод задуматься о том, насколько хорош ваш дизайн в принципе.

Похожий принцип применим и к работе с людьми и продуктами. Когда вы находитесь в ситуации неопределенности, подумайте о том, как провести быстрый и простой эксперимент, который бы дал вам хоть какие-нибудь предварительные данные.

2b) Избавьтесь от проблемы раз и навсегда (aka Автоматизируйте)

Люди не должны тратить время на вещи, которые намного лучше получаются у компьютеров. Это даже не обсуждается.

Мы все занимаемся программированием, чтобы сделать жизнь проще и автоматизировать то, что можно автоматизировать. Казалось бы, инженеры будут пытаться максимально применить этот принцип к себе в том числе. Но оказывается, что вовсе нет!

Много раз я видела людей, из раза в раз делающих одну и ту же повторяющуюся задачу вручную вместо того, чтобы ее автоматизировать. Главное оправдание в такой ситуации – “это займет всего несколько минут, а автоматизация процесса займет целый день”. Иногда это даже правда, но далеко не так часто, как может показаться.

Автоматизируя задачу:

  • Любой сможет справиться с этой задачей, даже человек, который только начал работать в команде, или автоматический процесс. Минуты ручной работы быстро соберутся в часы и даже дни – задача будет запускаться когда вы спите, когда вы едите, и когда вы болеете.
    Автоматизирование маленькой задачи может открыть двери для более масштабной оптимизации.
  • Вы можете обнаружить ситуации, о которых вы даже не задумывались до того, как попытались автоматизировать весь процесс.
  • Создавая процессы для того, чтобы позднее их автоматизировать, вы существенно улучшите свой навык дизайна процессов.


2c) Развивайтесь

Не занимайтесь одним и тем же слишком долго. После того, как вы освоили какую-то область, либо автоматизируйте ее (см. выше), либо обучите другого инженера для этой работы и двигайтесь дальше. Растите профессионально, не позволяйте себя застояться.

Иногда люди не делают этого потому, что их работа кажется им рутинной и они не хотят переваливать эту рутину на других. Но то, что вам может показаться рутиной, будет прекрасной возможностью чему-то научиться для другого, возможно менее опытного, инженера. Даже если это не так, для команды скорее всего имеет намного больший смысл, когда в конкретной задаче разбираются сразу несколько человек. Иначе она может стать узким звеном.

Иногда люди держатся за свои задачи потому, что им кажется, что объяснить их другим слишком сложно, или потому, что они считают, что справляются с ними лучше всех. Если это ваш случай, то вам стоит всерьез задуматься о создании хорошей документации.

Я постоянно советую инженерам в своих командах переключатся на новые задачи и развиваться профессионально.

3. Не работайте в вакууме (aka Общайтесь с другими)

Старайтесь описывать дизайн систем, над которыми вы будете работать, заранее (aka пишите design docs). Посылайте эти документы вашим коллегам и спрашивайте, что они думают. Делая это, вы:
  • Упорядочите ваш собственный мыслительный процесс.
  • Удостоверитесь, что похожим проектом не занимается кто-то еще.
  • Улучшите свой дизайн, воспользовавшись полезными советами ваших коллег.
  • Намного проще найдете коллег, которые согласятся вам помочь.
  • Покажете себя активным и ответственным членом команды.


Говорите о своей работе (можно со слайдами). Предлагайте другим рассказать об их работе. Активно интересуйтесь, чем занимаются другие в вашей и соседних командах. Вы и ваша команда от этого только выиграет.

Многие не хотят говорить и писать о своей работе пока она не готова. Или они просто не любят писать. Это слабоватые оправдания. Если вы не хотите писать, или не хотите делать презентацию сразу для целой команды, то начните с малого – просто поговорите с одним конкретным коллегой, нарисуйте схематичный дизайн на доске. Это поможет вам упорядочить свои мысли, и написать документ или обсудить его с целой группой будет намного проще.

Если статья вам понравилась, то заходите ко мне в блог. Возможно, там вы найдете для себя еще больше интересного. У меня уже почти 300 статей на тему Google, карьеры, саморазвития и продуктивности (некоторые из них когда-то были на Хабре). Я люблю писать, и, как мне кажется, у меня неплохо получается. Как минимум иногда.
Буду рада, если вам понравится!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330296/


Метки:  

Анонс RamblerElixir #3

Вторник, 06 Июня 2017 г. 01:18 + в цитатник

Приглашаем разработчиков, тимлидов и всех, кто так или иначе связан с разработкой на Elixir, принять участие в RamblerElixir Meetup, который состоится 14 июня 19:00, в среду, на уютной мансарде Rambler&Co.

В программе встречи три доклада:

1. Лингвистическая относительность – Станислав Герман (Rambler&Co)
У каждого языка есть принципы, на которых он основан. Для Erlang — «Let it crash and let someone else deal with it», для Ruby — «less astonishing» и «programmer happiness», в Python такие принципы как «Explicit is better than implicit», сформулированы в «Zen of Python». В то время, как одни взгляды нам близки, а другие мы не принимаем, они формируют не только дизайн языка и архитектуру библиотек и систем, которые разрабатываются на этом языке, но и сообщество разработчиков вокруг этого языка. В своем докладе я рассмотрю какие принципы заложены в Elixir, чем знание этих принципов полезно разработчику, и как они влияют на код, который мы пишем и используем в своей работе.

2. Трюки с ETS – Алексей Никитин (Bookmate)
У меня сложилось впечатление, что в Elixir-сообществе незаслуженно подзабыли про такую штуку как ETS. Про этот мощный инструмент, который предоставляет платформа. Я расскажу несколько хитростей, которые сделают работу с ETS более удобной и как решить некоторые проблемы, которые возникают при работе с ним. Доклад будет интересен в основном новичкам. Но, возможно, и опытные разработчики смогут узнать что-то новое.

3. Фреймворк для работы с нейронными сетями на Elixir – Алексей Овчинников (Sirin)
Нейронные сети набирают всё большую популярность в ИТ-индустрии, во многом благодаря применению графических сопроцессоров. Существует множество библиотек для реализации нейронных сетей, большинство из которых написано на Python или C. Вместе с тем платформа Erlang OTP позволяет без лишних усилий реализовать отказоустойчивое приложение с высокой степенью распараллеливания вычислений, и, на наш взгляд, идеально подходит для реализации высоко интегрированного решения для обработки потокового видео с помощью нейронных сетей. Также в библиотеке реализован медиа-сервер для приёма потокового видео. Таким образом пользователь может сосредоточиться на конфигурации нейронной сети, не отвлекаясь на технические детали обработки видео.

Регистрация здесь — rambler-co-e-org.timepad.ru/event/505943

Сбор гостей в 18:30.
Начало первого доклада в 19:00.
Место проведения – Мансарда Rambler&Co, которая расположена по адресу ул. Варшавское шоссе д.9 стр.1

Приходите, будет интересно!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330290/


Метки:  

Swift Playgrounds 1.5. Программируем Sphero и многое другое

Вторник, 06 Июня 2017 г. 01:06 + в цитатник

Сегодняшний день для всех людей, интересующихся продукцией фирмы Apple, стал днём начал WWDC17, на которой представлены много интересных вещей, таких как iOS 11, MacOS High Sierra и другие. Но я ждал 5 июня не только из-за этого. Я ждал новую версию Swift Playgrounds и она вышла!

Что такое Swift Playgrounds?
Как пишет сама компания Apple: «Swift Playgrounds is a revolutionary app for iPad that makes it fun to learn and experiment with code.» И действительно, на простых интерактивных примерах, понятных даже детям, объясняются основы программирования с использованием языка Swift.
Пользователь работает в так называемой «песочнице» — playground, отсюда и название.

Как выглядит Swift Playgrounds?
В новой версии был произведён редизайн приложения. Теперь при запуске вы попадаете в главное меню. Оно оформлено, как многие Apple-приложения в виде «книжной полки».

При нажатии на элемент «Get PlayGround» — мы попадаем в небольшой магазин различных песочниц. Что важно — все они бесплатные. Все песочницы — делятся на несколько типов :
  • «Learn to Code» — Простые уроки для полных новичков
  • «Challenges» — Различные задачи, уже полноценные проекты
  • «Accessories» — Появились только в этой версии, рассматривается работа с внешними устройствами (Sphero, LegoMindstorms, Dash и тд)
  • «Starting Points» — Пустые шаблоны для обучения.


В данный момент все песочницы используют Swift версии 3.1.

Accessories — основная новинка
Нужно сказать, что и до этого обновления в интернете можно было найти песочницы для взаимодействия с внешними устройствами. И действительно, если Apple позиционирует это приложение для обучения детей, то нет ничего лучше наглядного применения. Но все эти песочницы оставляли желать лучшего. Были сложности с их загрузкой и подключением внешних устройств. Посмотрим, что же нам предложит Apple, на примере работы с роботом Sphero.

Sphero & Swift
Для Sphero доступны две песочницы — «Sphero Arcade» и «Sphero Template».
Начнём с первой.

Всё очень просто, при первом запуске рассказывается, чему нас научит этот курс, а дальше запускаются обычные уроки.
Рассказывается как подключить, описываются простейшие команды, предлагаются задачки.

Рассматриваются следующие функции:
  • roll — движение с заданной скоростью и с заданым направлением
  • wait — пауза заданное количество секунд
  • stopRoll — остановка
  • onCollision — метод для обработки столкновений


После этого предлагается создать Ping-Pong, где в качестве мяча используется Sphero.

Что же касается Sphero Template — это просто шаблон, где определены все функции для работы с роботом. Кроме этого, в отдельной части экрана отображаются реальные характеристики робота в данный момент: скорость, угол, показания акселерометра и гироскопа.


С учётом того, что теперь можно взаимодействовать с:
Swift Playgrounds становится по-настоящему интересной и может использоваться для проведения различных интерактивных занятий и мастер-классов. Небольшим, но ощутимым недостатком можно назвать отсутствие русской локализации.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330288/


Метки:  

Check Point Security CheckUP — R80.10. Часть 3

Понедельник, 05 Июня 2017 г. 23:53 + в цитатник

Третья и заключительная часть, касающаяся возможности проведения бесплатного аудита безопасности сети с помощью Check Point Security CheckUP. Если вы пропустили прошлые части:

Закончив установку и инициализацию мы можем приступить к самой настройке. Далее будет следовать большое кол-во картинок. Если же вам лень читать, то можете подписаться на наш YouTube канал, где в скором времени появится видео инструкция по CheckUP.

Первым делом необходимо поправить топологию сети, как это показано на рисунке ниже. У нас должно появится два интерфейса.

Далее мы должны определить первый интерфейс (который используется для управления и выхода в интернет) как Internal, включить антиспуфинг в режим detect и отключить логирование (дабы не захламлять отчет):

Второй же интерфейс мы обязательно определяем как External с аналогичными настройками антиспуфинга.

В итоге должно получиться следующее:

Теперь можно переходить к включению блейдов. Для этого двойным кликом открываем свойства шлюза и начинаем галочками отмечать нужные блейды (Application Control, URL Filtering, IPS...):

Если же вы попытаетесь включить Threat Emulation

то обнаружите ошибку:

К сожалению Trial режим на 15 дней не включает функцию облачной песочницы (Threat Emulation). Если данная функция очень нужна, то можно запросить демо-лицензию на месяц.

Для идентификации пользователей (именно username, а на ip-адреса) необходимо настроить интеграцию с AD с помощью блейда Identity Awareness

Для этого используется учетная запись с админскими правами. Фактически Check Point подключается к серверу AD и выгребает логи связанные с аутентификацией пользователей, после чего он может сопоставить пользователя и его ip-адрес. Указав домен, учетные данные и ip-адрес AD сервера мы должны успешно подключиться:

Включив нужные фаервольные блейды (Network Security) мы можем перейти на вкладку Management и включить блейд Smart Event:

Именно этот блейд позволяет генерировать комплексные отчеты.

После этого не забудьте нажать Ok, а не просто закрыть окошко. Теперь можно перейти к настройки некоторых блейдов. Начнем с Application Control. Укажите настройки в соответствии с картинкой ниже:

Тоже самое сделайте для блейда Threat Prevention:

Теперь можно перейти к настройкам политик. Начнем с обычных фаервольных. Естественно разрешаем весь трафик и ВЫКЛЮЧАЕМ логирование. Данные логи абсолютно не интересны в отчете и лишь увеличивают нагрузку на устройство при их обработке:

Теперь Application Control и URL filtering. По умолчанию данная политика отсутствует (в отличии от R77.30) и чтобы это исправить, нужно сначала их включить. Делается это следующим образом:

Добавляем новый Layer:

с именем Apllication и отмечаем только один блейд:

Должно получиться следующее:

Теперь в политиках появилось Application. Разрешаем весь трафик:

И обязательно включаем Detaild Log и Accounting:

Затем можем попробовать обновить базы:

Процесс обновления будет отображаться в левом нижнем углу. Дождитесь его окончания:

Теперь можно перейти к настройкам политики Threat Prevention. По умолчанию устанавливается дефолтная политика с профилем Optimized:

Необходимо поправить настройки. Двойным кликом открываем свойства профиля и выставляем все в режим Detect (нет смысла в Prevent на копии трафика):

В настройках Ативируса включаем «глубокое» сканирование и проверку архивов:

В настройках Threat Emulation (если вы получили лицензию) включаем эмулирование для всех поддерживаемых файлов:

При нажатии Ok, нам предложат сохранить профиль под новым именем:

Сохранив, выставляем его в политиках Threat Prevention (правой кнопкой мыши по профилю):

Теперь можно перейти в раздел Updates и попробовать обновить IPS и другие блейды:

Кроме того, нужно зайти в глобальные свойства Check Point:

И отключить Drop-ы, как на картинке ниже:

Теперь необходимо проинсталлировать политики. Нажимаем Install Policy:

И сначала отмечаем только Access Control (Threat Prevention не установится без этой политики):

После успешной установки еще раз нажимаем Install Policy и выбираем уже только Threat Prevention:

Готово! Если вы правильно настроили SPAN-порт, то Check Point уже должен начать обрабатывать трафик. Чтобы убедиться в этом можно перейти во вкладку Logs & Monitor и отфильтровать логи например по блейду Apllication Control:

Если все хорошо, то оставьте логирование хотя бы на один день, после чего можно будет посмотреть статистику нажав на New Tab — Reports — Security CheckUP Advanced

Должно получиться следующее:

Данный отчет вы сможете скачать в PDF формате, при этом есть возможность сделать отчет анонимным, т.е. исключить параметры, по которым можно идентифицировать вашу организацию.

Желательное время для сбора статистики — две недели. Пример отчета можно посмотреть здесь.

Вот таким «нехитрым» образом можно провести экспресс анализ безопасности вашей сети. Искренне надеемся, что данная информация кому-то пригодится. Если возникнут вопросы то можете смело обращаться. Повторюсь, в скором времени на нашем канале будет выложена видео инструкция.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330074/


Пеленгатор на дополненной реальности

Понедельник, 05 Июня 2017 г. 22:18 + в цитатник

image(скриншот или фото)


Когда я только начинал инженерную деятельность разработкой пеленгаторов, в головах опытных товарищей, называемых нами, молодыми, за глаза "дедами", бродила мечта о “пеленгаторе на пупке”. “Это — говорили они — такой маленький пеленгатор, который можно носить с собой и пеленговать украдкой. Вот, дескать, нам приходится таскать на себе такие тяжести на крышу и обратно (хотя таскала, конечно, молодежь), а они, молодежь, никак не разработают такую вещь”. Смотря на стоящие на столе огромные железяки, мы считали их немного не в себе.


Со временем техника уменьшалась в размерах, конечно не настолько, чтобы можно было носить за пазухой. Но несколькими годами позднее, познав немного проектирование антенной техники, я уже не относился к этим мечтам старших товарищей, как к бредням.


Затем буря экзистенциального кризиса вынесла меня из уютного офиса прославленной в узких кругах организации в жестокий океан народного хозяйства. Но молодость не отпускает, она въедается в наш мозг и я обнаружил — что бы я ни взялся делать, у меня почти всегда выходил пеленгатор. По крайней мере, так говорят мои товарищи.


Ужасный рок! Но я осмотрелся и увидел, что пеленгаторы могут быть нужны обычным людям. Это давало надежду!



Сначала укажу на интерес сугубо мирных организаций к пеленгаторам (Direction Finders). В организации Bluetooth есть рабочая группа по внедрению возможности определения угла прихода волны в радио-средства Bluetooth стандарта номер 5. Они прорабатывают изменения в физическом уровне, которые позволят строить пеленгаторы источников излучения Bluetooth. Целью разработки, скорее всего, является улучшение позиционирования мобильных устройств пользователя и Bluetooth-радиометок (маяков). Они бывают персональные, которые можно носить с собой или вешать на вещи, и инфраструктурные, которые крепят на стены. Сейчас их в любом случае почти всегда позиционируют по уровню сигнала. Это такие вот штуки (все на свете их уже видели):


image(фото разных меток)


И действительно, давайте представим себе будущий мир, напичканный устройствами Интернета Вещей (IoT — Internet of Things). В одной с вами комнате будут излучать несколько десятков IoT-устройств: лампочки, колонки, датчики внешней среды, нательные гаджеты, смартфоны, планшеты, маячки на детях, собачках, котиках, wifi-роутеры, чайники, кофеварки, стиральные машины и другие взрослые игрушки). И хорошо, если вы уже бывали в этом месте и ваш гаджет запомнил соответствие идентификатора устройства конкретной физической вещи. А если вы здесь впервые, а вам обязательно надо приглушить свет или звук вот в этой части комнаты (ужас! неужели это правда будет кто-то делать). И вы ни за что не захотите свайпить длинный список устройств, а захотите просто перевести свое внимание — навести свой гаджет — на нужный предмет и управлять им. Вот тогда будет очень нужно знать, какой идентификатор устройства в фокусе вашего внимания.


(Бред, но хоть что-то! Хоть какой-то смысл в каждодневных усилиях одинокого инженера!)


image(фото AR-мира)


Сначала я пошел по проторенной дороге — стал делать фазовый пеленгатор. Но вскоре увидел, что это уже сделано. Есть финская фирма Quoppa, как я думаю, осколок от объединения с Microsoft какого-то подразделения Nokia. Они внедряют свои пеленгаторы в системы позиционирования в помещениях. Их штука подвешивается к потолку и показывает вектор в направлении Bluetooth-маяка, которым уже сегодня может быть все что угодно.


Вообще, Nokia была главным застрельщиков в этом вопросе. Вот статья черте-какого года, в которой они рассказывают про пеленгатор Bluetooth на мобильном устройстве. Тогда даже название Интернет Вещей еще было не на слуху.


Осознав, что существующий уровень техники не позволяет мне создать малогабаритный фазовый пеленгатор, я начал пробовать амплитудный. Хотя электроника для нахождения угла прихода волны двигалась вперед. Фирмы Broadcom и Marvel анонсировали чипсеты с поддержкой Bluetooth 5 с функцией пеленгования (AoA — angle of arrival). Но получить доступ даже просто к документации не получилось. А их ребята на конференция бодро рассказывали (про позиционирование Bluetooth 5 устройств сразу смотрите с 12-й минуты 25-й секунды), как скоро пользователи мобильных устройств будут направлять смартфон на Bluetooth устройство и получать информацию. То есть, это получается дополненная реальность в интернете вещей. Концепция!


image(картинка или фото про AR IOT)


Так вот, амплитудный пеленгатор. Естественно хотелось сделать что-то маленькое. Обычная направленная антенна не подходит. Размеры ее зависят от направленности, на стандартную частоту 2.4 ГГц ничего хорошего в размерах планшета не получить. Тут всплыло давно забытое старое решение — моноимпульсный амплитудный пеленгатор. В те времена, когда приемники были дорогие и громоздкие, а пеленговать было нужно, инженеры пользовались не "положительной", а “отрицательной” направленностью. Грубо говоря, ловили не на максимум сигнала, а на минимум, на ноль. Так работает и рамочная антенна на коротковолновых пеленгаторах, знакомых неискушенному читателю, например, по фильму о Штирлице. Так же работает и пеленгатор в “охоте на лис”. И еще во многих хороших и не очень пеленгаторах.


image(фото рамочного и лисятниковского пеленгаторов)


Характерной особенностью таких пеленгаторов является необходимость двигаться для получения точного пеленга. Нет, можно и стоять на месте, но тогда отсчет будет неточный. Точность в таком пеленгаторе живет возле нуля диаграммы направленности.


Первый блин вышел таким.


image(фото BLUEX)


Эта штука состоит из двух антенн. Первая имеет плавную диаграмму направленности, а вторая — резко меняющуюся.


image(графики)


По разнице уровней с двух антенн можно определить насколько близко по углу источник волны находится в нормали к плоскости устройства. Чем больше разница, тем ближе источник к нормали к плоскости устройства или, другими словами, к фокусу камеры планшета или смартфона, если устройство закреплено с его тыльной стороны.


Первый такой пеленгатор был сделан для Bluetooth-маяков. Вот ролик с демонстрацией его работы.


Хотя устройство получилось маленьким, у него была большая зависимость от поляризации падающей волны. При падении на такой пеленгатор волны с вектором поляризации преимущественно параллельным к плоскости устройства пеленгационная характеристика вырождалась. Грубо говоря, он просто переставал работать. На ролике видно, что надо было немного вращать устройство вокруг оси, перпендикулярной его плоскости.


Таким образом, надо было сделать штырь с круговой поляризацией. Эта задача в исходных размерах пока не решена, но если увеличить пеленгатор раза в два, то можно предложить конструкцию типа расфазированной антенной решетки. Это решетка из четырех элементов, фазы которых повернуты друг относительно друга. У нее будет ноль по нормали и круговая поляризация. Как показывают графики, разница между диаграммами направленности для горизонтальной и вертикальной поляризаций незначительна.


Это измеренные характеристики реальной модели:


image(графики)


Размеры пеленгатора стали вдвое больше, сильно возросла сложность антенны, но поляризационное вырождение пропало.


Теперь пеленгатор работает так. И выглядит так:


image(фото XNZR)


Собственно приемник может быть построен на любом Bluetooth или WiFi-модуле или чипе. Например, на ESP8266, как сделано сейчас. Устройство соединяется с мобильным девайсом по USB. Разница уровней инвертируется и показывается на фоне реального видео как размер окружности. Чем дальше фокус камеры от направления на источник, тем больше диаметр, чем ближе — тем меньше. Что вполне естественно, при наведении на источник круг сжимается.


Исходники приложения на Андроид доступны на GitHub.


Следует упомянуть две базовые проблемы. Во-первых, чувствительность такого пеленгатора заведомо намного хуже фазового, так как она определяется усилением антенны в минимуме диаграммы направленности. Во-вторых, на такой пеленгатор влияет многолучевость, как и на все другие, но встроенной возможности справляться с ней у пеленгатора нет. В условия интерференции нужно двигаться, чтобы обнаружить местоположение источника. Нужна некоторая тренировка, чтобы научиться делать это быстро.


Но на счет этой сложности есть кое-какие соображения. Если они подтвердятся, то я обязательно здесь об этом напишу.


Попытка внедрения пеленгатора в народное хозяйство оказалась провальной. Поэтому мне очень важно услышать ваше мнение о том, кому могло бы пригодиться такое устройство и для чего.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/323638/


Как настроить простую систему автотестов без Java и Selenium

Понедельник, 05 Июня 2017 г. 21:33 + в цитатник
Представьте: вы работник стартапа, сварганили по-быстрому прототип и постепенно начинаете его развивать. И вот вам уже хочется, чтобы во время очередного спешного релиза не приходилось перепроверять все разделы сайта вручную (руками директора по продукту). Конечно, можно нанять отдельного тестировщика, но на это в вашем LEAN-стартапе бюджета не дают — «лучше давайте купим наконец-то кофе-машину». Знакомо?

И тут кто-то произносит слово «автотесты».

И сразу начинается: это целая история, это очень сложно, это очень дорого, от этого будет больше вреда, чем пользы и вообще это кровавый Enterprise и СЕЛЕНИУМ.



А вам всего-то надо, чтобы какая-то программа открывала браузер и там тыкала ссылки, вбивала тексты и смотрела, что получится. Неужели это так сложно и дорого?

Теперь можно с уверенностью сказать: нет.

Всё изменилось недавно — с приходом Headless Chrome: в очередной версии Хрома он просто научился запускаться в «headless» режиме (т.е. без интерфейса).

И даже главный разработчик PhantomJS'а написал в связи с этим:

This is the end — https://t.co/GVmimAyRB5 #phantomjs 2.5 will not be released. Sorry, guys!

— Vitaly Slobodin (@Vitalliumm) April 13, 2017

Переходя к делу


Итак, всё, что вам нужно для запуска автотестов в современном мире, это:
1) Chrome версии 59 (на данный момент в beta) или Chromium Browser
2) nodejs + npm

Всё!

(Конечно, если вы делаете что-то специфическое, что нужно проверять в разных браузерах, тогда увы. Можете дальше не читать.)

Хром в этой связке выступает, очевидно, в качестве headless-браузера, открывающего ссылки и рендерящего страницы. (Что может быть лучше в роли headless-браузера, чем сам браузер?!) Вот как легко можно установить тот же Chromium Browser в Ubuntu:

sudo apt-get install chromium-browser


В качестве так называемого WebDriver'а, предоставляющего API, чтобы «тыкать на ссылки и вбивать тексты», мы будем использовать Chromedriver. Устанавливаем через npm:

npm install chromedriver


Сами тесты мы, конечно, хотим писать на чистом JavaScript'е (2к17 год на дворе). Для этого возьмём Nightwatch.js — это весьма известная библиотека для написания и запуска автотестов (от разработчиков LinkedIn). Первоначально Nightwatch.js заточен на работу с тем самым Селениумом. Но не все знают, что оно также умеет работать с Chromedriver напрямую. Устанавливаем:

npm install nightwatch


Вкратце вся схема выглядит так (тест на Nightwatch.js -> серия запросов к Chromedriver -> тыканье ссылок в Headless Chrome):

-> Chromedriver ->

И как настроить-то?


По умолчанию конфигурация для Nightwatch берётся из файла nightwatch.json из папки node_modules/nightwatch/bin.

Нам нужна собственная конфигурация. Для этого создадим файл nightwatch.json в корне проекта и пропишем туда всё необходимое, чтобы Chromedriver использовался напрямую (без Селениума) и Chromium запускался в «headless» режиме:

nightwatch.json
{
  "src_folders": ["tests"], // путь к папке с тестами
  "output_folder": "reports",
  "custom_commands_path": "",
  "custom_assertions_path": "",
  "page_objects_path": "",
  "globals_path": "globals.js", // путь к файлу, в котором задаётся глобальный контекст для всех тестов

  "selenium": {
    "start_process": false // отменяем запуск Селениума, т.к. будем обращаться к Chromedriver напрямую
  },

  "test_settings": {
    "default": {
      "selenium_port": 9515, // номер порта Chromedriver по умолчанию ("selenium_" в имени поля — это пережиток прошлого)
      "selenium_host": "localhost",
      "default_path_prefix" : "",

      "desiredCapabilities": {
        "browserName": "chrome",
        "chromeOptions" : {
          "args" : ["--no-sandbox", "--headless", "--disable-gpu"], // специальные флаги для работы Хрома в headless-режиме
          "binary" : "/usr/bin/chromium-browser" // путь к исполняемому файлу Хрома
        },
        "acceptSslCerts": true
      }
    }
  }
}

Обратите внимание на строку с globals.js. Внутри этого файла можно задать глобальный контекст для всех тестов. Пропишем туда, чтобы Chromedriver стартовал перед запуском всех тестов и прибивался в конце:

globals.js
const chromedriver = require('chromedriver');

module.exports = {
  before: function(done) {
    chromedriver.start();

    done();
  },

  after: function(done) {
    chromedriver.stop();

    done();
  }
};

Осталось написать какой-нибудь тест для проверки. Например: открыть ya.ru, поискать что-нибудь и проверить результаты поиска. Конечно, Nightwatch.js API предоставляет ещё кучу всяких методов для всевозможных проверок, но для начала нам хватит:

ya.js
module.exports = {
  'Test ya.ru': function(browser) {
    const firstResultSelector = '.serp-list .organic__subtitle b';

    browser
      .url('http://ya.ru', () => {
        console.log('Loading ya.ru...');
      })
      .waitForElementVisible('#text', 5000)
      .execute(function() {
        document.getElementById('text').value = 'Привет, Хабр!';
      })
      .submitForm('form')
      .waitForElementVisible(firstResultSelector, 5000)
      .getText(firstResultSelector, result => {
        browser.assert.equal(result.value, 'm.habrahabr.ru');
      })
      .end();
  }
};

Проверяем!

$ nightwatch --test tests/ya.js

[Ya] Test Suite
===================

Running: Test ya.ru
Loading ya.ru...
Element <#text> was visible after 70 milliseconds.
Warn: WaitForElement found 10 elements for selector ".serp-list .organic__subtitle b". Only the first one will be checked.
Element <.serp-list .organic__subtitle b> was visible after 1706 milliseconds.
Passed [equal]: m.habrahabr.ru == m.habrahabr.ru

OK. 3 assertions passed. (4.992s)


Итого


Итого весь процесс настройки Системы Автотестов занял менее получаса. И, главное, ту же систему можно быстро развернуть на практически любом сервере, что даёт прекрасную масштабируемость.

Так что прощай Java, прощайте тесты на Python'е, прощай Selenium.

А вот кофе-машина действительно нужна.

полезные ссылки:
1) «Getting Started with Headless Chrome»: developers.google.com/web/updates/2017/04/headless-chrome
2) «Nightwatch.js API reference»: nightwatchjs.org/api
3) хорошая презентация на тему Nightwatch.js: www.youtube.com/watch?v=794uaoenv_M
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/329660/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 994 993 [992] 991 990 ..
.. 1 Календарь