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

Поиск сообщений в 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 ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

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

Прототипирование в среде Python-Arduino

Вторник, 19 Сентября 2017 г. 11:20 + в цитатник
Scorobey сегодня в 11:20 Разработка

Прототипирование в среде Python-Arduino

  • Tutorial
Привет, Хабр! Хочу на примерах рассказать о самом простом способе создания чего то сложного. Суть страшного слова «прототипирование» сводится к использованию аналогий или шаблонов в проекте Arduino.

Не хочу пугать длинными словами начинающих пользователей Python-Arduino, по-этому идем сразу по примерам.

Зуммер — генерирует звуковой сигнал тревоги


Зумер [1]. выдает звук, когда снабжен цифровым значением HIGH (то есть, +5 В), которое может быть обеспечено с помощью цифровых выводов Arduino [2].

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

Соединения





Код Python


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

Прежде чем перейти к объяснению кода, необходимо открыть файл программы, buzzerPattern.py, из папки кода. В начале кода можно найти функцию Python buzzerPattern (), которая будет вызываться из основной программы с соответствующими параметрами. Эта функция является ядром всей программы.

Функция содержит два массива массивов с жестким кодом, pattern1 и pattern2. Каждый из них содержит время включения и выключения зуммера в течение секунды, которое является рабочим циклом шаблона.

Например, в pattern1 0,8 представляет время, в течение которого зуммер должен быть включен, а 0,2 представляет противоположное.

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

Как только весь цикл повторения завершен, снова полностью отключим зуммер, если он включен, и безопасно отключим плату с помощью метода exit ():

def buzzerPattern(pin, recurrence, pattern):
  pattern1 = [0.8, 0.2]
  pattern2 = [0.2, 0.8]
flag = True
  for i in range(recurrence):
    if pattern == 1:
      p = pattern1
    elif pattern == 2:
      p = pattern2
    else:
      print "Please enter valid pattern. 1 or 2."
      exit
    for delay in p:
      if flag is True:
        board.digital[pin].write(1)
        flag = False
        sleep(delay)
      else:
        board.digital[pin].write(0)
        flag = True
        sleep(delay)
  board.digital[pin].write(0)
board.exit()


Остальная часть программы относительно проста, поскольку содержит код для им-порта библиотек и инициализации платы Arduino. Как только плата инициализируется, выполним функцию buzzerPattern () с входным аргументом (2, 10, 1). Этот аргумент попросит функцию воспроизвести pattern1 10 раз на контакте номер 2:

from pyfirmata import Arduino
from time import sleep

port = '/dev/cu.usbmodemfa1331'
board = Arduino(port)
sleep(5)

buzzerPattern(2, 10, 1)


Двигатель постоянного тока — управление скоростью двигателя с использованием двигателей PWM


DC [3] широко используется в робототехнических приложениях. Они доступны в широком диапазоне характеристик напряжения, в зависимости от применения.

В этом примере используем электродвигатель постоянного тока 5 В, потому что мы хотим подавать питание с помощью самой платы Arduino. Поскольку цифровой вывод Arduino может иметь только два состояния, то есть HIGH (+ 5V) или LOW (0V), невозможно управлять скоростью двигателя, используя только режим OUTPUT.

В качестве решения мы собираемся реализовать режим PWM с помощью цифровых выводов, которые способны поддерживать PWM. При использовании pyFirmata выводы, сконфигурированные в режиме PWM, принимают любые значения ввода с плавающей точкой от 0 до 1.0, которые представляют 0 и 5 В. соответственно.

Соединения


Чтобы не повредить плату Arduino из-за большой случайной потери тока, мы будем использовать транзистор в качестве переключателя, который использует только небольшое количество тока для управления большим током в двигателе постоянного тока.

Для завершения соединения цепи, как показано на следующей схеме, понадобятся NPN-транзистор (TIP120, N2222 или аналогичный), один диод (1N4001 или аналогичный) и резистор на 220 Ом с DC-двигателем.

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



Код Python



Пользовательская функция, dcMotorControl (), принимает скорость и длительность двигателя в качестве входных параметров, как описано в следующем фрагменте кода:

def dcMotorControl(r, deltaT):
pwmPin.write(r/100.00)
sleep(deltaT)
  pwmPin.write(0)


Используем аналогичный код для импорта необходимой библиотеки и инициализации платы Arduino.

После инициализации мы назначаем режим цифрового вывода 3 как PWM, что видно из использования метода get_pin ('d: 3: p'). Этот код отражает косвенный режим назначения пинрежима, о котором мы узнали в предыдущем разделе:

# Set mode of pin 3 as PWM
pwmPin = board.get_pin('d:3:p')


В процессе сбора ручных данных от пользователя мы запускаем комбинацию опера-тора try / except (чтобы освободить плату при выходе) и инструкцию while (чтобы получить непрерывные данные от пользователя).

Шаблон кода вводит метод input () для получения пользовательских значений (скорости двигателя и продолжительности запуска двигателя) из интерактивного терминала Python. Как только эти значения получены от пользователя, программа вызывает функцию dcMotorControl () для выполнения моторного действия: try:

try:
 while True:
    r = input("Enter value to set motor speed: ")
    if (r > 100) or (r <= 0):
      print "Enter appropriate value."
      board.exit()
      break
t = input("How long? (seconds)")
    dcMotorControl(r, t)
except KeyboardInterrupt:
board.exit()
  os._exit


LED — контролируя яркость светодиода с использованием PWM



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

Будем использовать этот модуль для генерации случайного числа от 1 до 100, которое позже будет использовано для записи этого значения на выводе и случайного изменения яркости светодиода.

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

Соединения


Понадобится подтягивающий резистор для подключения светодиода к контакту Arduino. Необходимо подключить анод светодиода (более длинный нож) к цифровому вы-воду 11 через один резистор с сопротивлением 220 Ом и соединить катод (более короткая нога) с землей:



Важно отметить, что цифровой контакт 11 на Arduino Uno также способен выполнять PWM вместе с цифровыми булавками 3, 5, 6, 9 и 10.

Код Python


Используем код Python с названием ledBrightnessPWM.py Значение float между 0 и 1.0 выбирается случайным образом, прежде чем передавать его на вывод PWM.
Первые несколько строк кода импортируют необходимые библиотеки и инициализируют плату.

from pyfirmata import Arduino, INPUT, PWM
from time import sleep
import random

port = '/dev/cu.usbmodemfa1311'
board = Arduino(port)
sleep(5)


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

pin = 11
Board.digital [pin] .mode = PW


После конца цикла нужно безопасно отключить плату Arduino после выключения светодиода в последний раз.

board.digital[pin] .write(0)
board.exit()


Выводы


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

Ссылки


  1. Зуммер (Trema-модуль).
  2. Книга: «Arduino Basic Connections».
  3. Arduino и двигатели.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/337986/


Метки:  

Концепция развития платформы: ожидания 2013 года и реальность 2017-го

Вторник, 19 Сентября 2017 г. 11:17 + в цитатник
sapozhkov сегодня в 11:17 Разработка

Концепция развития платформы: ожидания 2013 года и реальность 2017-го



    Четыре года назад я выступал на осенней конференции Tabtabus с рассказом о том, как мы в WebCanape разрабатываем и выпускаем сайты. В процессе выступления я сделал несколько прогнозов на 4 года вперед. Срок прошел, и настало время проанализировать, насколько они были верны и как все поменялось за это время.

    Сначала проведу небольшой сравнительный анализ предметной области (2013 vs 2017), затем расскажу об основных направлениях в работе и наших методах реализации.

    Если кому интересно, добро пожаловать под кат.



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

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

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

    В данный момент я руковожу направлением разработки ядра Canape CMS, на которой собираются все сайты, выпускаемые студией WebCanape. Мой отдел непосредственной прибыли не приносит, но результаты его работы лежат в основе большинства процессов, которые монетизируются напрямую.

    Работу студии можно разделить на несколько направлений
    1. Продажа и производство сайта
    2. Продвижение и реклама сайтов — генерация клиентов (абонентские платы и разовые услуги)
    3. Инструменты для работы — CRM (абонентка)


    Ожидание №1. Основную прибыль будет приносить не разработка сайтов, а их продвижение


    Реальность. Прогноз оправдался.

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

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

    Отсюда требования к работе команды Canape CMS и к продукту.
    • Платформа Canape CMS и все процессы разработки должны быть стандартизированы и описаны в регламентах разработчиков;
    • Наличие инструментов для удобной и быстрой доработки индивидуальных функциональных модулей;
    • Регулярный сбор требований от пользователей для формирования пула доработок;
    • Ведение актуальная документация по продукту: 1) для пользователей, 2) для разработчиков.
    • Автоматическое тестирование типовых проблем и функций;
    • Доработка инструментов для упрощения разработки.

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

    Ожидание №2. Через 4 года будет выпущено более 5000 сайтов


    Реальность. На текущий момент сдано более 2350 сайтов.

    Клиентам больше не нужен сайт за 12 000 рублей со стандартным функционалом. За такую же стоимость клиент хочет продукт с множеством уникальных доработок под конкретный бизнес.

    Ожидание №3. Будем выпускать типовые сайты с минимальными доработками


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

    Почему клиентов для типовых решений стало меньше?

    Возможно, из-за финансового кризиса. Возможно, из-за серьезного развития конструкторов сайтов.

    5-6 лет назад бесплатные конструкторы на выходе давали достаточно топорный сайт. Элементы были расклеены, как стикеры, на четко определенные места. Чтобы настроить SEO-продвижение такого сайта, необходимо было долго разбираться в этом вопросе.

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

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

    Ожидание №4. Выпустим свой конструктор сайтов, чтобы компенсировать недостаток типовых проектов и займем эту нишу


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

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

    • Единый центр управления для сайтов
    • Горизонтальное масштабирование — ввод в строй новых серверов должен быть максимально простым
    • Регулярные обновления — быстрый и удобный инструмент накатывание изменений на сервера / площадки
    • Ускорение и упрощение процесса разработки конечных сайтов — площадки для новых проектов должны создаваться быстро

    Как мы решаем эти задачи
    Для работы с большим количеством однотипных площадок был разработан собственный продукт: SMS — Site management system (по аналогии с CMS — Content management system).

    Это система управления площадками. Из функциональности на борту:
    • создание базовых конфигураций сайтов с набором предустановленных функциональных модулей;
    • клонирование — это основной инструмент, имея набор сконфигурированных площадок, можно брать готовый вариант, максимально соответствующий конечной цели, за основу для разработки. В результате получается до 50% экономии времени и средств;
    • резервное копирование — как по cron, так и в ручном режиме;
    • архивирование — перемещение в архив площадок временно не используемых или устаревших, с возможностью их быстрого восстановления;
    • импорт/экспорт — сохранение файлов и данных с метаинформацией в архив, для их дальнейшей публикации на сторонних хостингах или для перемещения на другой сервер Canape SMS;
    • привязка доменов к площадкам;
    • формирование очередей задач, выполняемых по cron, для выравнивания нагрузки на ресурсы сервера;
    • мониторинг состояния сервера;
    • и многое другое.

    Система активно используется:
    • для размещения сайтов — как хостинг для разработанных на Canape CMS проектов;
    • для разработки — мы создаем сайты в аналогичной инфраструктуре с небольшим дополнительным функционалом для разработчиков;
    • как самостоятельная платформа — мы продаем не просто сайт, а целую инфраструктуру для того, чтобы клиент имел возможность генерировать новые площадки под свои нужды. Сайты создаются из специально собранного набора «болванок», которые можно быстро превратить в самостоятельные проекты.

    Пример — сайты органов государственной власти, сформированные на Canape SMS, находятся в одном кластере: admin-smolensk.ru, korso.admin-smolensk.ru, antinark.admin-smolensk.ru, antiterror.admin-smolensk.ru и другие. Все площадки имеют типовую структуру, сгенерированную заказчиком, вынесены на собственные домены и имеют отдельные системы управления содержимым.


    Ожидание №5. Будет много заказов на «мультисайтовые» системы с единым центром управления


    Реальность. У малого и среднего бизнеса таких потребностей почти нет. Ключевые задачи нашей целевой аудитории решаются системой из 2-4 связанных сайтов, где применение такого подхода нецелесообразно.

    «Кластерные» и «отцепленные» площадки

    Это внутренние термины. «Кластерной» мы называем площадку (сайт), созданную через SMS и не имеющую собственных файлов ядра CMS. Все файлы ядра лежат в специальной директории, которой заведует SMS. Для каждой версии сборки есть свой набор файлов.

    Соответственно, «отцепленными» от кластера площадками мы называем обычные сайты, содержащие в рабочей директории полный комплект файлов для функционирования.

    Что дает эта концепция работы?
    • Снижение размера площадки: резервные копии делаются быстрее и занимают меньше места, процесс клонирования площадки идет быстрее, снижение суммарного объема памяти для множества сайтов одной версии.
    • Ускорение работы — одни файлы делают работу для многих сайтов.
    • Возможность обновления менеджером — если площадка кластерная, то доработок на ней гарантированно нет, и можно провести автоматическое обновление. Участие программиста не требуется.
    • Возможность быстро накатить «баг фигсы» на часть площадок

    Доработка уникального функционала проектов

    Если проект не может быть собран на типовом функционале и его надо дорабатывать, то он «отцепляется» от кластера. Для этого есть специальный инструмент в SMS, и впоследствии сайт спокойно дорабатывается независимо от общего программного ядра.

    Вот как это происходит с технической точки зрения.

    Основная сборка разрабатывается с использованием системы контроля версий Git. При этом для каждого релиза создается отдельный тэг.
    • SMS создает Fork (копию проекта) от основного репозитория.
    • Разворачивает его в отдельной директории.
    • Создает индивидуальную ветку доработок в том месте, где стоит метка текущей версии проекта.
    • Разворачивает эту ветку.
    • Поверх копируются файлы площадки.

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

    Fork позволяет решить:
    • вопрос с Pull Request (запросами на добавление нового реализованного функционала в основной репозиторий);
    • вопрос с точечными заборами коммитов (изменений) из доработанного проекта в сборку.

    Ожидание №6. Система должна быть понятна для клиентов, администраторов и разработчиков


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

    Разработчики могут быстро (в зависимости от сложности задачи и собственного опыта) дорабатывать конкретные решения.

    SEO-специалисты регулярно транслируют информацию о том, что Canape CMS — очень удобная и прогрессивная платформа с точки зрения поискового продвижения. Понятно, что лучшая – та CMS, которую знаешь ты. Но наш отдел продвижения работает почти со всеми популярными на рынке системами. И такая оценка с их стороны является показателем хороших результатов работы нашей команды и неплохой мотивацией для дальнейшего развития платформы Canape CMS.

    Итоги


    Это слайд с моего доклада 2013 года.


    Четыре года назад мы прогнозировали выпуск более 5 000 сайтов к 2017 году. По факту сегодня создано 2350+ сайтов. Изначально мы ориентировались на несложные сайты с типовым дизайном, то по факту сейчас разрабатываем достаточно объемные проекты с интеграциями, адаптивным дизайном и уникальными программными модулями.

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

    Есть набор вопросов, которые часто задают, поэтому сразу отвечу на некоторые из них



    Почему создали свою CSM, а не использовали другую?
    — Canape CMS — система полного цикла для быстрого производства сайта студией. Не одиноким фрилансером, не собственными силами клиента, не системным администратором компании, а именно студией, где все процессы регламентированы и стандартизированы. Сайт с индивидуальным функционалом и дизайном разрабатывается не за год или полгода, а за 2-3 недели.

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

    Почему не взяли бесплатное решение?
    — Потому что оно не соответствует первому пункту.

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

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

    Другие материалы по теме:


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

    https://habrahabr.ru/post/338184/


    Метки:  

    Тайминговая атака на Node.js — когда время работает против вас

    Вторник, 19 Сентября 2017 г. 11:17 + в цитатник

    Метки:  

    RailsClub 2017. Интервью с Никитой Шильниковым, Dry-rb и Rom-rb core-разработчиком

    Вторник, 19 Сентября 2017 г. 10:19 + в цитатник
    vorona_karabuta сегодня в 10:19 Разработка

    RailsClub 2017. Интервью с Никитой Шильниковым, Dry-rb и Rom-rb core-разработчиком

      Отсчет до конференции RailsClub 2017 идет на дни, а мы продолжаем публиковать разговоры с нашими спикерами. Павел Аргентов расспросил Никиту Шильникова, разработчика Dry-rb и Rom-rb, о работе, книгах и состоянии дел в Ruby-сообществе.

      image
      Как ты начал программировать на Ruby?

      Все было просто. Я до этого не программировал за деньги. Вначале я был менеджером, и мне предложили работать программистом. Я пошел. Там были Ruby и Oracle (они там и сейчас есть). С тех пор я так в одном месте и работаю, уже 7 лет, переключаясь между задачами.

      У тебя есть “профподготовка” или ты учился сам?

      У меня техническое образование. В институте я изучал C++, Prolog и ассемблер. До того, как я устроился на работу, я знал Javascript и С++, постольку-поскольку.

      Ты сразу занялся веб-разработкой, или было что-то другое?

      Там, куда я пришёл работать, был веб, были рельсы. Ядро системы было в Oracle, а интерфейс на Rails, плюс немного Javascript-а. Rails неплохо работают с “хранимками”, ну то есть когда в них нет бизнес-логики :) (хранимые процедуры — П.А.).

      Сейчас ты так и работаешь в вебдеве?

      Фактически да.

      А как ты вышел на опенсорс?

      На одной конференции — точно не помню — вроде DevConf, была секция про Ruby. Там Кирилл Мокевнин рассказывал про DDD, и я понял, что все, чем мы на работе занимаемся — это Domain Driven Design. Кирилл рассказал что в ActiveRecord есть проблемы с отображением сущностей предметной области на реляционную базу, что есть ребята, которые делают ROM, а сначала сделали DataMapper. Это меня заинтересовало, и с того времени (2012 год) я начал следить за ROM. В 2015 году вышла версия 1.0. Мне как раз подвернулся новый проект — я использовал Rails, потому что уже с ними работал. Выкинул оттуда ActiveRecord, вставил ROM и начал с этим бороться. В ходе этой борьбы я пришел к коммитам в опенсорс-проекты ROM и dry-rb.

      ROM и dry-rb известны заимствованиями из FP. Как ты считаешь, насколько важно добавлять в Ruby приемы функционального программирования?

      Я не фанат какого-то конкретного языка программирования. Я за то, чтобы для каждой задачи выбирать подходящий инструмент. Есть языки общего назначения, которые могут решать разные задачи, и в них есть сильные и слабые стороны. Сам Ruby, который появился больше 20 лет назад, изначально был объектно-ориентированным. Однако на него оказал очень сильное влияние LISP. Даже Матц говорил, что хотел сделать смесь Perl и LISP. А LISP — это первый функциональный язык. Выходит, если покопаться поглубже, у Ruby есть функциональные предки. Мне кажется, мы так зациклились на ООП, что не дали развиваться в Ruby другим инструментам. Я считаю, что нужно посмотреть на другие языки программирования и заимствовать то, применимо к Ruby. Можно ли совместить FP и OOP? Мы пробуем.

      А почему dry gems называются именно DRY?

      Вообще, это просто trademark. Суть гемов — решать отдельные задачи. К примеру, dry-types описывает типы, типы можно переиспользовать разными способами в разных местах. В этом один из смыслов названия.

      В какую сторону будет развиваться Ruby вообще и рельсы в частности?

      Стандартный вопрос. Матц, например, боится того, что случилось с питоном: с Python 2 на Python 3 был слишком большой скачок, не хотелось бы такого повторения в Ruby. А вот переход с Ruby 1.8 на 1.9 был ощутимым, но не болезненным. Я не думаю, что в Ruby будут серьезные изменения, которые сломают обратную совместимость. Про Rails не могу сказать чего-то конкретного.

      Чего, на твой взгляд, не хватает в Ruby?

      Тут могу сказать вполне определенно чего не хватает мне: pattern matching. Помимо приложений я пишу библиотечный код — там использовать pattern matching было бы просто здорово. С точки зрения приложений можно добавить примитивы многопоточного программирования, избавиться от GIL. Еще не хватает немутабельных структур: идея немутабельности позволяет размышлять о коде гораздо проще, а это было бы полезно для новичков. В dry-struct, например, мы эмулировали немутабельность. Наверное, было бы здорово, если такие инструменты были и в самом языке.

      На твой взгляд, самые заметные явления в экосистеме Ruby кроме dry и rom?

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

      Зачем же нам очередные рельсы?

      Я повидал всякого, работая над одним большим проектом. Начинал с выкидывания SQL из шаблонов. В рельсах вообще есть много вопросов без ответа — о том, как развивать большой и долгий проект. Мы научились с этим работать но не пришли к единым стандартам, поэтому было бы круто иметь фреймворк, где все что, нужно, стандартизировано. Серьёзная проблема в Rails — ActiveRecord, спорный паттерн с определенными недостатками. Например, с него сложно слезать. А еще, чем больше “прячешь” от него бизнес-логику, тем он лучше работает.

      Какие ты мог бы посоветовать сайты\курсы\книжки для начинающих и для опытных рубистов?

      Я бы посоветовал новичкам работать со сложными книгами так: прочитать первый раз, чтобы что-то отложилось в голове, и по мере работы возвращаться к ней как к справочнику. Отличный пример — “Шаблоны проектирования архитектуры корпоративных приложений” Мартина Фаулера. Книга написана в 2002 году и до сих пор актуальна, многие классы в рельсах реализуют какие-то паттерны из нее. Лично у меня на первое место сейчас вышла другая книга для опытных программистов — Martin Kleppmann, “Designing Data-Intensive Applications”. Это не очень глубокая, но отлично написанная книга, с кучей ссылок по интересующим темам. Автор занимается в основном изучением распределенных систем, он писал эту книгу 4 года, и она посвящена работе с данными в различных системах. Там дано внятное, хорошее описание многих аспектов работе с данными, и она не привязана к конкретному языку. Если хочется повысить свой уровень как разработчика, это самое то.

      Назови самую большую проблему Ruby сообщества?

      Нам нужно показать, что мы все еще не раскрыли весь потенциал языка, и, хотя ему уже 20 с лишним лет, мы можем применять новые подходы как в старых задачах, так и в новых, развивающихся областях!

      Интересно? А в докладе Никиты про типы в Ruby будет еще интереснее! Откладывать покупку билета уже некуда, остались последние места! Регистрация тут, цена билета — 9000 рублей.
      Организатор конференции: Evrone

      Спасибо лучшим компаниям, которые нас поддерживают! Например, Рево — международной fintech компании, которая более 5 лет создаёт передовой сервис оплаты частями в партнёрстве с крупнейшими торговыми сетями и интернет магазинами. Никакого пластика. Никаких бумаг. Просто. Быстро. Современно.

      Ждем вас на конференции, до встречи!
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/338208/


      Метки:  

      [Перевод] Великолепная подборка бесплатных шрифтов: лучшие из лучших

      Вторник, 19 Сентября 2017 г. 10:15 + в цитатник
      TashaFridrih сегодня в 10:15 Дизайн

      Великолепная подборка бесплатных шрифтов: лучшие из лучших

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



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



      Serif fonts


      1. Droid Serif




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

      2. Butler




      Это микс семейств шрифтов Dala Floda & Bodoni. Был создан для того, чтобы немного модернизировать шрифты с засечками. Отлично подходит для плакатов, большого размера книг. В общей сложности семейство Butler содержит 334 символов.

      Ссылка для скачивания

      3. Arvo




      Arvo — это семейство шрифтов, которое подходит как для вывода на дисплей, так и для печати. Разработано Антоном Коовитом для чтения, Arvo в каталоге Google Font — бесплатный открытый шрифт (OFL).

      4. Crimson Text




      Бесплатное семейство шрифтов, созданное специально для книжного производства с нотками старинных шрифтов Garamond-esque. Crimson Text — разработан немецким дизайнером, проживающим в Торонто, Себастьяном Кош. Crimson — прекрасная альтернатива традиционному Garamond-esque, с выразительным курсивом, прекрасно сочетается с геометрическими засечками, такими как Futura или Avenir.

      5. Aleo




      Aleo — полукруглый с гладкой структурой шрифт, придающий нотки индивидуальности, но при этом удобочитаемый. Бесплатное семейство шрифтов, которое включает в себя шесть стилей, 3 насыщенности шрифта / weight (Light, Regular и Bold) с соответствующим курсивом. Шрифт был разработан Alessio Laiso.

      6. Cormorant




      Cormorant — это экстравагантный шрифт с засечками, наследие исторических шрифтов фран­цузс­ко­го пу­ан­со­нис­та и из­да­теля Клода Га­рамо­на. Был нарисован вручную Кристианом Тальманом. «Острые резкие засечки, опасно гладкие кривые», такой шрифт лучше всего использовать для заголовков или в текстах больших размеров (плакаты). Читабелен как при выводе на экран, так и в печатном виде. Cormorant поддерживает кириллицу, каждый из стилей представлен в пяти насыщенностях Light, Regular, Medium, Semibold, Bold.

      7. Brela




      Brela — это гуманистический шрифт с засечками, предназначенный исключительно для редакционного дизайна. Шрифт был разработан испанским креативным агентством Makarska Studio, одинаково хорош при использовании в текстах с небольшим кеглем и для написания заголовков.

      Скачать Brela Regular

      8. Libre Baskerville




      Libre Baskerville — это веб-шрифт, созданный американской фирмой ATF (American Type Founders 1941 год). Шрифт с высокой x, ему свойственна меньшая контрастность, что позволяет использовать его для чтения на экране.

      9. Jura




      Шрифт Jura — необычно элегантный шрифт с отличительными деталями, такими как округлые клиновидные засечки. Он хорошо выглядит при больших и маленьких размерах текста. Бесплатный шрифт был создан британским дизайнером Эдом Мерриттом.

      10. Fenix




      F'enix — это шрифт с засечками и грубыми штрихами, он прекрасен для чтения, для текстов с небольшим размером кегля. Шрифт под названием птицы счастья — работа Фернандо Диаса, дизайнера уругвайского литейного завода TipoType.

      11. Luthier




      Luthier — это современный шрифт с характерными резкими засечками и высоким контрастом, наличие двух видов насыщенности + курсив. Хорошо подходит для заголовков, для основного текста, для серьезных интеллектуальных проектов. Бесплатный шрифт был создан живущим в Барселоне дизайнером Адрианом Гомесом.


      Free sans-serif шрифты


      12. Agan`e




      Шрифт Agan`e — это чистый без засечек шрифт, разработанный швейцарским графическим дизайнером, специалистом UI Данило де Марко. Свободный для персонального и коммерческого пользования, Agan`e — это результат вдохновения такими шрифтами как Noorda Font, FF Transit и Frutiger. Оптимизированный для удобочитаемости даже при небольших размерах кегля. Доступен в 4 насыщенностях: light, regular, bold и extra bold. Agan`e является лауреатом премии IF Design 2017 года.

      13. Titillium Web




      Как для бесплатного шрифта, у Titillium очень респектабельная родословная, которая берет свое начало с дизайн-проекта итальянской академии di Belle Arti di Urbino. Каждый учебный год десятки студентов работают над проектом, развивают его, совершенствуют шрифт путем анализа предоставленных данных от дизайнеров, которые используют этот шрифт в своих работах. Он острый, современный и поставляется в широком диапазоне насыщенностей. Лучше всего он подходит для написания заголовков.

      14. League Gothic




      League Gothic — это сжатый без засечек, вдохновленный классическим шрифтом Alternate Gothic # 1, шрифт изначально был разработанным Моррисом Фуллером Бентоном для American Type Founders Company в 1903 году. Это возрождение старой классики, новая версия забытого старого.

      15. Chivo




      Chivo — гротескный шрифт, он идеально подходит для заголовков и других надписей, которыми вы хотите привлечь внимание. Уверенный, элегантный, он предлагается в четырех насыщенностях с использованием курсива. Этот бесплатный шрифт — работа Эктора Гатти и команды Omnibus-Type.

      16. Comfortaa




      Comfortaa — это округлый геометрический шрифт без засечек, предназначенный для текстов с большим размером кегля. Создан был инженером-конструктором Технического университета в Дании Johan Aakerlund. Это простой, красивый шрифт, который включает в себя большое количество различных символов.

      17. Noto Sans




      Noto Sans (от «No more tofu») относится к семейству бесплатных шрифтов, которое охватывает более 800 языков и оперирует свыше 110 тыс. символами, не пропущен ни один из символов, заложенных в системе Юникод.

      18. HK Grotesk Hanken




      HK Grotesk — шрифт без засечек, создание которого — продукт вдохновения классическими гротескными шрифтами, такими как Akzidenz Grotesk, Univers, Trade Gothic и Gill Sans. Он был разработан Hanken Design Co с целью создания дружественного и удобочитаемого шрифта, который подходил бы для текста с небольшим кеглем. Недавно была добавлена кириллица.

      19. Aileron




      Aileron — это универсальный нео-гротескный шрифт без засечек, что-то между Helvetica и Univers. Был создан Sora Sagano, дизайнер компании Tipotype. Он призван обеспечить читателям высокий уровень визуального комфорта.

      20. Ubuntu




      Этот бесплатный шрифт был специально создан компанией Dalton Maag по заказу Canonical в дополнение к операционной системе Linux для использования в персональных компьютерах, планшетах и смартфонах.

      21. Clear Sans




      Clear Sans — это универсальный шрифт, разработанный Intel для комфортного вывода на экран. Подходит и для печати, и для использования в сети. Он универсален, в сдержанном стиле (без засечек) шрифт с поддержкой OpenType.

      22. Source Sans Pro




      Выпущенный в 2012 году, Source Sans Pro был первым семейством шрифтов с открытым исходным кодом для Adobe, его популярности можно позавидовать. Это классический гротескный шрифт с простым, непритязательным дизайном разработан дизайнером компании Adobe Паулом Хантом.


      Handwriting fonts


      23. Nickainley




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

      24. Pacifico




      Pacifico — это удобный забавный рукописный шрифт, вдохновением послужила американская серф-культура 1950 годов. Этот шрифт с открытым исходным кодом разработан покойным дизайнером Верноном Адамсом, который скончался в прошлом году. Вернон закончил магистратуру по дизайну шрифтов в Университете Рединга и жил в Калифорнии.

      25. Cute Punk




      Cute Punk — это яркий, молодежный и полностью современный подход к рукописным шрифтам. Это работа Флоу, дизайнера и иллюстратора из Братиславы, Словакия.

      26. Futuracha




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

      27. Yellowtail




      Yellowtail — классический рукописный шрифт, старая школа 1930 годов, таких как Gillies Gothic и Kaufmann. Разработан был типографическим институтом Astigmatic, смесь связующих и несвязанных буквенных форм придает ему уникальный внешний вид и в то же время обеспечивает удобочитаемость.


      Винтажные и ретро шрифты (vintage and retro fonts)


      28. Cheque




      Cheque — изначально был студийным проектом Мирела Белова, в нем нотки геометрических фигур и классический, винтажный образ. Он используется в заголовках версии Regular и Black бесплатны как для личного, так и для коммерческого пользования.

      29. Bauru




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

      30. LOT




      LOT — один из самых толстых, крутых, ретро-бесплатных шрифтов. Стилизованные надписи в блогах и рекламе, на плакатах и в журналах в стиле 1970, 1980 годов. LOT — гладкий новый винтажный стиль с коллекцией толстых геометрических букв. Располагает 78 символами, бесплатный шрифт LOT хорош для разработки логотипов, для заголовков.

      31. Streetwear




      Окунутся в ретро атмосферу? Запросто! Шрифт Streetwear — крутой, смелый шрифт в стиле ретро-моды и -спорта 1960, 1970 годов. Универсальный и веселый одновременно. Подходит для логотипов, плакатов, упаковки и дизайна футболок.

      32. Paralines Font




      Paralines Font — шрифт в ретро-футуристическом стиле. Здесь своеобразно использованы параллельные линии, такая техника вдохновляет дизайнеров, шрифт подходит для любого проекта, передает настроение 1970 начала 1980 годов.

      33. Hamurz




      Бесплатный шрифт Hamurz — хипстерский ретро стиль с грубыми краями и округлыми формами. Созданный Bagus Budiyanto, он может применяться для создания логотипов, заголовков, рисунков на футболках, значках или на печатных изданиях.


      Brush fonts


      34. Leafy




      Leafy — бесплатный ручной работы шрифт. Содержит более 90 символов, нарисован Крисиджанисом Мезулисом. Идеально подходит для любого дизайна.

      35. Playlist




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

      36. Sophia




      Бесплатный шрифт Sophie для декоративного оформления, легкий, дружелюбный и безмолвно-веселый. Рукописный шрифт со сладким декоративным бонусом)

      37. Reckless




      Reckless — шрифт для поднятия настроения, включает прописные латинские символы. Хорош для создания эффекта акварельных красок для печати и для веб проектов. Был создан российским дизайнером Надей Спасибенко.

      38. Kust




      Kust — это рукописный шрифт, слегка искаженными штрихами. Он был представлен в нарисованном виде — на твердой бумаге черными чернилами толстой кистью дизайнером Leva Mezule.

      39. Brux




      Шрифт Brux с оригинальным подходом к рукописным шрифтам, он довольно жесткий, с чертами формальности, вызывает ощущение шрифта, нарисованного под трафарет.


      Шрифты в стиле тату (tattoo fonts)



      40. Betty




      Betty — один из тех бесплатных шрифтов, которые возвращают в прошлое, когда у каждого «настоящего мужчины» был якорь моряка и «дама сердца», наколотая на бицепсе.

      41. Angilla




      Angilla — чрезвычано свежий и стильный tattoo шрифт, работа шведского дизайнера Mans Greb"ack.

      42. Serval




      Бесплатный шрифт Serval — это жилистый, колючий зверь со своеобразным дизайном.

      43. MOM




      MOM — это шрифт, в стиле американской старой школьной татуировкой, дань уважения великим художникам-татуировщикам прошлого.

      44. Original Gangsta




      Бескомпромиссный стиль в каждом символе шрифта Original Gangsta. Нет милосердию, Gangsta — это жесткий шрифт для брутальных надписей.


      Шрифты в стиле графити (graffiti fonts)


      45. Ruthless Dripping One




      Ruthless Dripping One — один из немногих бесплатных шрифтов в стиле граффити, который выглядит реалистично. Большинство бесплатных шрифтов-граффити — в действительности стилизованные шрифты без чувства искусства, стиля и игривости, которые так важны для городской уличной арт-сцены.

      46. Urban Jungle




      Трафареты — это фокус современного уличного искусства. В Urban Jungle смешаны традиционные трафареты с добавлением текстуры, что мгновенно окунает в атмосферу улицы, яростной улицы.

      47. Blow Brush




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

      48. Sister Spray




      Бесплатный шрифт Sister Spray по красивому грязный шрифт с распылителя: буквы, цифры и кучу брызг, пятен и штрихов.

      49. Tag Type




      Tag Type вдохновлен граффити-тегами, содержит буквы верхнего и нижнего регистра, цифры и знаки препинания. Шрифт создан украинским дизайнером Энди Панченко.


      Необычные шрифты (unusual fonts)


      50. Gilbert




      Шрифт назван в честь дизайнера-создателя радужного флага Гилберта Бейкера, который умер в 2017 году, он был активистом LGBTQ и художником, известен тем, что создал знаковый флаг радуги. Gilbert доступен в стандартном векторном формате, цветном формате OpenType-SVG и анимированной версии.

      51. Jaapokki




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

      52. Carioca Bebas




      Свежий, фруктовый, красочный шрифт. Carioca — это новое, веселое создание. Этот восхитительный бесплатный шрифт был разработан в рамках трехмесячного экспериментального проекта аргентинских графических дизайнеров Тано Верона и Яи Салинаса.

      53. Le Super Serif




      Шрифт Le Super Serif — это редкая вещь: типографский эксперимент голландского дизайнера Тийса Янссена. Модный заглавный шрифт на современный западный лад. Шрифт имеет 88 лигатур и несколько «специальных» альтернативных символов.

      54. Pelmeshka




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

      55. Tiny Hands




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

      Какой бы дизайн и шрифт для своего сайта, проекта вы не выбрали, необходимо заранее подумать о его надежном размещении и хранении. Наши специалисты помогут вам подобрать оптимальный вариант, согласно потребностям и возможностям, будь то хостинг за 0,99 $ или дорогостоящая инфраструктура корпоративного класса. Будьте уверены в том, что ваша информация размещена в надежном дата-центре премиум класса, а ценовая политика предоставления услуг — волшебна. Акции — еще одни шаг навстречу нашим пользователям.

      На правах рекламы.Акция! Только сейчас получите до 4-х месяцев бесплатного пользования VPS (KVM) c выделенными накопителями в Нидерландах и США (конфигурации от VPS (KVM) — E5-2650v4 (6 Cores) / 10GB DDR4 / 240GB SSD или 4TB HDD / 1Gbps 10TB — $29 / месяц и выше, доступны варианты с RAID1 и RAID10), полноценным аналогом выделенных серверов, при заказе на срок 1-12 месяцев, условия акции здесь, cуществующие абоненты могут получить 2 месяца бонусом!

      Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/337358/


      Метки:  

      Как перевести криптовалюту в другой блокчейн: немного о сайдчейнах

      Вторник, 19 Сентября 2017 г. 10:09 + в цитатник
      alinatestova сегодня в 10:09 Разработка

      Как перевести криптовалюту в другой блокчейн: немного о сайдчейнах

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

        Приложила к этому руку и компания Bitfury Group. Например, в начале июля мы провели первую транзакцию в Lightning Network c использованием биткойн-протокола. Задача этой сети — ускорить транзакции и снизить издержки на их проведение.

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

        / изображение Ardonik CC

        Почему side


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

        Резиденты Stack Exchange предложили аналогию, описывающую работу сайдчейнов. Федеральный резерв печатает доллары США по заказу правительства — это основной блокчейн. Однако туристы могут брать деньги и вывозить их в другие страны — сайдчейны — с иной экономической обстановкой. Однако эта валюта все равно будет подкрепляться правительством США.

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


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

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

        После подтверждения блокирующей транзакции, в целевой блокчейн отправляется сообщение. В сообщении вы «прикладываете» доказательство, что монеты поступили на особый адрес в биткоин-сети, и отправителем являетесь вы. Далее, во втором блокчейне генерируется аналогичное количество токенов, и вы получаете над ними контроль.

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

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

        Разберем подробнее


        Для перехода из основного блокчейна в сайдчейн, монеты замораживаются в первом и активируются во втором. Эта операция называется двойной фиксацией (two-way peg). Есть несколько вариантов её реализации.

        Метод с одним хранителем

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

        Метод федерации

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

        В начале года Blockstream представили whitepaper о «сильных федерациях», представляющий их видение принципов двойной фиксации и его реализацию в сайдчейне Liquid. Он используется для передачи биткоинов между биржами.

        Вот код для вычисления адреса цепочки, на который нужно отправить токены, представленный в документе Blockstream:



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

        Сайдчейн SPV

        Это концепция, которая базируется на децентрализованной фиксации two-way peg. Чтобы перемещать монеты в сайдчейн и обратно, этот тип фиксации использует SPV-доказательства. Они доказывают существование транзакции в блоке с помощью специального набора данных.

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

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

        Drivechain

        Drivechain — это развитие идеи сайдчейнов. В драйвчейне о текущем состоянии блокчейна сообщают майнеры. Иными словами, майнеры являются хранителями средств и способны «размораживать» монеты пользователей, желающих перевести их назад в основной блокчейн. Концепция драйвчейна была предложена экономистом Bloq и создателем Bitcoin Hivemind Полом Шторцем (Paul Sztorc).

        Главной аксиомой в понятии драйвчейнов является то, что майнеры — наименее «проблемные» хранители средств с точки зрения теории игр.

        Гибриды

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

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

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

        Работа на перспективу


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

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

        Дополнительное чтение по теме:

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

        https://habrahabr.ru/post/338222/


        Метки:  

        Трюки в Chrome DevTools

        Вторник, 19 Сентября 2017 г. 10:03 + в цитатник
        SSul сегодня в 10:03 Разработка

        Трюки в Chrome DevTools

        • Tutorial
        Перейдем к самому интересному — подборке самых полезных и интересных, на наш взгляд, трюков и скрытых возможностей Chrome DevTools.

        Верстка.


        1. Инспектируем анимацию.


        Меню анимаций в DevTools позволит вам замедлить все анимации на странице или подвигать “руками” конкретную анимацию.
        image

        2. Экспериментируем с цветами


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

        3. Редактируем любой текст на странице


        Допустим у вас есть текстовый блок на страницы и вы хотите узнать, как он будет выглядеть, если текст в нем изменится. Переключите документ в режим дизайна! Наберите в консоле document.designMode = 'on', аналогично работает document.body.contentEditable = true. После этого вы сможете редактировать все элементы имеющие текстовый контент.
        image

        4. Просмотр отрендеренных шрифтов


        Иногда очень сложно сказать, какой шрифт на самом деле был отрендерен. В нижней части Computed вкладки панели инструментов, вы можете увидеть какой шрифт используется, даже если его названия нет в списке font-family.
        image

        5. Принудительные псевдоклассы для элементов


        DevTools имеет функцию, которая имитирует применение псевдоклассов CSS, например такие как :hover и :focus на элементах, что упрощает их стилизацию. Она доступна из редактора CSS.
        image

        6. Изменение формата цвета


        Используйте Shift + Клик на предварительном просмотре цвета, чтобы изменить формат: rgb, hsl и hex.
        image

        7. Редактор кривых безье для анимации.


        Вы можете легко изменить временные функции используя DevTools (например, значение свойства для animation-timing-function CSS свойств).
        image

        Возможности консоли.


        1. Вывести HTML элемент в представлении JS объекта


        При чтении HTML, браузер генерирует DOM-модель. Если необходимо вывести элемент именно в виде JS объекта в консоль, проще всего для этого воспользоваться методом console.dir().
        image

        2. Группировка сообщений


        Иногда бывает полезно сгруппировать логи для упрощения работы с ними и меньшего засорения консоли. Для этого существуют методы console.group(), console.groupCollapsed() и console.groupEnd().
        function name(obj) {
          console.group('name');
          console.log('first: ', obj.first);
          console.log('middle: ', obj.middle);
          console.log('last: ', obj.last);
          console.groupEnd();
        }
        name({"first":"Wile","middle":"E","last":"Coyote"});
        

        image

        3.1. Вывод значений переменных в виде таблиц


        Иногда намного удобнее и нагляднее работать с массивами или объектами в виде таблицы, а не в виде стандартного иерархического представления. Для вывода данных в виде таблице существует метод console.table().
        function Person(firstName, lastName) {
          this.firstName = firstName;
          this.lastName = lastName;
        }
        var family = {};
        family.mother = new Person("Jane", "Smith");
        family.father = new Person("John", "Smith");
        family.daughter = new Person("Emily", "Smith");
        console.table(family);
        

        image

        3.2 keys(object) и values(object)


        Keys() — возвращает массив имён свойств объекта.
        Values() — возвращает массив, содержащий значения всех свойств указанного объекта.
        image

        4. Логирование времени выполнения кода


        Представьте, что у вас есть две функции которые делают одно и тоже но их реализация различна. Как понять какая из них работает быстрее? Можно воспользоваться методами console.time() и console.timeEnd().
        image

        5. Профилирование


        Помимо замера времени можно профилировать Ваш код и вывести стек профилирования, который подробно показывает, где и сколько времени потратил браузер.
        console.profile();
        // Some code to execute
        console.profileEnd();

        image

        6.1. $(selector)


        Если вы знакомы с jQuery, то знаете о возможности конструкций вроде $(‘.class’) и $(‘#id’). Консоль разработчика обладает похожей функциональностью. Здесь «$» отношения к jQuery не имеет, хотя делает, то же самое. Это – сокращение для функции document.querySelector(), возвращает ссылку на первый элемент DOM с указанным CSS-селектором. При этом, если в документе доступна jQuery, её «$» перекроет функционал консоли.

        6.2. $$(selector)


        Возвращает массив элементов, содержащих указанный селектор. Эта команда эквивалентна вызову document.querySelectorAll().
        image

        7. clear(), copy(object) и inspect(object/function)


        Clear() — очистка всех записей в консоли.
        Copy() — копирование в буфер обмена строкового представления указанного объекта.
        Inspect() — открывает и выбирает указанный элемент или объект в соответствующей панели: Elements или Profiles.

        Прочее.


        1. Продвинутая кнопка перезагрузки


        (Работает только при открытом DevTools и только в браузере Google Chrome!)
        По долгому нажатию на кнопку «Обновить страницу» (либо по правому клику) мы открываем специальное меню, которое предоставляет нам выбор:
        • Обычная перезагрузка (обновляются просроченные ресурсы).
        • Аппаратная перезагрузка (принудительная загрузка всех ресурсов сайта).
        • Очистка кэша и аппаратная перезагрузка.

        image

        2. Форматирование минифицированых исходников


        Инструменты разработчика Chrome имеют встроенный «прихорашиватель» минимизированных исходных кодов к удобочитаемому виду. Кнопка находится в левом нижнем углу открытого в данный момент файла во вкладке Sources.
        image

        3. Отображение shadow DOM


        Такие элементы как поля ввода и кнопки, браузеры, создают из других базовых элементов которые обычно скрыты. Тем не менее, вы можете перейти Settings -> General и включить Show user agent shadow DOM, для отображения этих базовых элементов во вкладке Elements. Это даст вам возможность оформлять их по отдельности.
        image

        4. Фильтрация и поиск


        При работе с DOM, CSS, списком запросов на вкладке Network и т.д. зачастую мы видим перед собой большой список элементов, селекторов, свойств и так далее, в котором бывает сложно быстро найти интересующее нас значение. В таких случаях не стоит забывать про использование фильтрации и поиска которое присутствует на всех вкладках. Благодаря фильтрации мы будем отсеивать все варианты кроме подходящих под условия, а поиск позволит Вам быстро найти то что нужно, если Вы знаете ключевые «слова» для поиска. Как правило поле поиска скрыто и вызывается комбинацией Ctrl + F.
        image

        5. Come to the Dark Side


        Просто потому что темная сторона круче (:
        А если серьезно, темная тема убережет ваши глаза от лишнего напряжения, если основной цвет разрабатываемой или отлаживаемой страницы темный, как в моем случае. Включить можно вначале страницы настроек DevTools.
        image

        Используемые ресурсы:
        developers.google.com/web/tools/chrome-devtools
        habrahabr.ru
        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/336710/


        Метки:  

        Точка Б: как мы обучали приложение Яндекс.Такси предсказывать пункт назначения

        Вторник, 19 Сентября 2017 г. 10:00 + в цитатник
        vkantor сегодня в 10:00 Разработка

        Точка Б: как мы обучали приложение Яндекс.Такси предсказывать пункт назначения

          Представьте: вы открываете приложение, чтобы в очередной раз заказать такси в часто посещаемое вами место, и, конечно, в 2017 году вы ожидаете, что все, что нужно сделать – это сказать приложению «Вызывай», и такси за вами тут же выедет. А куда вы хотели ехать, через сколько минут и на какой машине — все это приложение узнает благодаря истории заказов и машинному обучению. В общем-то все, как в шутках про идеальный интерфейс с единственной кнопкой «сделать хорошо», лучше которого только экран с надписью «все уже хорошо». Звучит здорово, но как же приблизить эту реальность? Об этом мы и хотим рассказать.



          На днях мы выпустили новое приложение Яндекс.Такси для iOS. В обновленном интерфейсе один из акцентов, как нетрудно заметить, сделан на выборе конечной точки маршрута («точки Б»). Но новая версия – это не просто новый UI. К запуску обновления мы существенно переработали технологию прогнозирования пункта назначения, заменив старые эвристики на обученный на исторических данных классификатор.

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

          Задача


          При выборе пункта назначения, в поле «куда» у нас есть возможность предложить пользователю буквально 2-3 варианта на главном экране и еще несколько – если он перейдет в меню выбора точки Б:



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

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

          «Старые» эвристики и обученный классификатор могут давать разные прогнозы: на этом рисунке размер круга показывает, насколько высоко данная точка находится в списке рекомендаций в конкретный день и конкретное время. Обратите внимание, что обученный алгоритм в данном примере предложил несколько дополнительных локаций (зеленые круги).

          Наша задача состояла в том, чтобы поверх «старой» стратегии использовать переранжирование наиболее вероятных «точек Б» с помощью машинного обучения. Общий подход такой: сначала начисляем баллы, как и раньше, затем берём топ n по этим баллам (где n заведомо больше, чем нужно в итоге порекомендовать), а далее переранжируем его и пользователю в итоге показываем только три наиболее вероятные точки Б. Точное число кандидатов в списке, конечно, определяется в ходе оптимизации, чтобы и качество кандидатов и качество переранжирования были как можно выше. В нашем случае оптимальное число кандидатов оказалось равным 20.

          Об оценке качества и результатах


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

          Начнём с первой метрики, то есть качества кандидатов. Стоит отметить, что только примерно в 72 процентах заказов выбранная точка Б (или очень близкая к ней географически) присутствовала ранее в истории. Это означает, что максимальное качество кандидатов ограничено этим числом, так как мы пока не можем рекомендовать точки, куда человек еще ни разу не ездил. Мы подобрали эвристики с назначением баллов так, что при отборе топ-20 кандидатов по этим баллам правильный ответ в них содержался в 71% случаев. При максимуме в 72% это весьма неплохой результат. Это качество кандидатов нас полностью устраивало, поэтому эту часть модели мы дальше не трогали, хотя, в принципе, могли бы. Например, вместо эвристик можно было обучить отдельную модель. Но так как механизм поиска кандидатов, основанный на эвристиках, уже был технически реализован, мы смогли сэкономить на разработке, лишь подобрав нужные коэффициенты.

          Снова вернемся к качеству переранжирования. Так как на главном экране заказа поездки показывать мы можем одну, две, ну максимум три точки, то нас интересует доля случаев, когда правильный ответ оказался в топ-1, топ-2 и топ-3 списка ранжирования соответственно. В машинном обучении долю правильных ответов в топ k списка ранжирования (от всех правильных ответов) называют recall@k. В нашем случае нас интересуют recall@1, recall@2 и recall@3. При этом «правильный ответ» в нашей задаче только один (с точностью до близко расположенных точек), а значит, эта метрика как раз будет показывать долю случаев, когда настоящая «точка Б» попадает в топ 1, топ 2 и топ 3 нашего алгоритма.

          В качестве базового алгоритма ранжирования мы взяли сортировку по количеству баллов и получили следующие результаты (в процентах): recall@1 = 63,7; recall@2 = 78,5 и recall@3 = 84,6. Заметим, что проценты здесь – это доля от тех случаев, где правильный ответ в кандидатах вообще присутствовал. В какой-то момент возник логичный вопрос: возможно, простая сортировка по популярности уже даёт хорошее качество, а все идеи сортировки по баллам и использование машинного обучения излишни? Но нет, такой алгоритм показал самое плохое качество: recall@1 = 41,2; recall@2 = 64,6; recall@3 = 74,7.

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


          Доля случаев, когда фактический пункт назначения попадал в число первых k рекомендаций

          Какая модель строилась


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

          Теперь перейдём к модели для переранжирования. Так как мы хотим максимизировать recall@k, в первом приближении мы хотим прогнозировать вероятность поездки пользователя в определенное место и ранжировать места по вероятности. «В первом приближении» потому, что эти рассуждения верны только при очень точной оценке вероятностей, а когда в них появляются погрешности, recall@k может лучше оптимизироваться и другим решением. Простая аналогия: в машинном обучении, если мы точно знаем все распределения вероятностей, самый лучший классификатор — байесовский, но поскольку на практике распределения восстанавливаются по данным приближенно, часто другие классификаторы работают лучше.

          Задача классификации ставилась следующим образом: объектами были пары (история предыдущих поездок пользователя; кандидат в рекомендации), где положительные примеры (класс 1) — пары, в которых пользователь все-таки поехал в эту точку Б, отрицательные примеры (класс 0) — пары, в которых пользователь в итоге поехал в другое место.

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

          Классификатор мы обучали на минимизацию log loss, а в качестве модели использовали активно применяемый в Яндексе Матрикснет (градиентный бустинг над решающими деревьями). И если с Матрикснетом всё понятно, то почему всё-таки оптимизировался log loss?

          Ну, во-первых, оптимизация этой метрики приводит к правильным оценкам вероятности. Причина, по которой так происходит, своими корнями уходит в математическую статистику, в метод максимального правдоподобия. Пусть вероятность единичного класса у i-го объекта равна $p_i$, а истинный класс равен $y_i$. Тогда, если считать исходы независимыми, правдоподобие выборки (грубо говоря, вероятность получить именно такой исход, который был получен) равно следующему произведению:

          $\prod_{i}p_i^{y_i}(1-p_i)^{(1-y_i)}$

          В идеале нам хотелось бы иметь такие $p_i$, чтобы получить максимум этого выражения (ведь мы хотим, чтобы полученные нами результаты были максимально правдоподобны, правда?). Но если прологарифмировать это выражение (так как логарифм — монотонная функция, то можно его максимизировать вместо исходного выражения), то мы получим $\sum_i y_i ln (p_i) + (1-y_i)ln(1-p_i)$. А это уже известный нам log loss, если заменить $p_i$ на их предсказания и умножить все выражение на минус-единицу.

          Во-вторых, мы, конечно, доверяем теории, но на всякий случай попробовали оптимизировать разные функции потерь, и log loss показал самый большой recall@k, так что все в итоге сошлось.

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

          И, наконец, о результатах: после переранжирования с помощью построенной нами модели мы получили следующие данные (опять же в процентах): recall@1 = 72,1 (+8,4); recall@2 = 82,6 (+4,1); recall@3 = 88 (+3,4). Совсем неплохо, но в будущем возможны улучшения за счет включения в признаки дополнительной информации.

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

          Дальнейшие планы


          Разумеется, впереди много экспериментов по улучшению модели. Будет и добавление новых данных для построения рекомендаций, в том числе интересов пользователя, а также предполагаемых «дома» и «работы» из Яндекс Крипты и связанных с ними признаков, и эксперимент по сравнению различных методов классификации в этой задаче. Например, у Яндекса уже есть не только используемый сугубо внутри команды Матрикснет, но и набирающий популярность и в Яндексе, и за его пределами CatBoost. При этом, конечно же, нам интересно сравнивать не только собственные разработки, но и другие реализации популярных алгоритмов.

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

          https://habrahabr.ru/post/337328/


          Метки:  

          Результаты летней стажировки 2017 в Digital Security. Отдел анализа защищенности

          Вторник, 19 Сентября 2017 г. 09:57 + в цитатник
          forkyforky сегодня в 09:57 Разработка

          Результаты летней стажировки 2017 в Digital Security. Отдел анализа защищенности

            image

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

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

            Краткая информация

            В компании Digital Security существует отдел анализа защищенности, чьи сотрудники ломают все подряд (с). А если конкретно, то в число наших задач входит проведение пентестов, анализ защищенности и анализ кода мобильных и web-приложений и корпоративного ПО, а также оценка осведомленности сотрудников компаний о мерах безопасности с помощью методов социальной инженерии и проверка устойчивости к D/DoS-атакам. Мы ждали близких нам по духу энтузиастов, готовых разбираться в интересных задачах и не отступающих перед трудностями.

            Введение

            Заявки на стажировку прилетели как от студентов, так и от уже вполне состоявшихся специалистов в смежных с ИБ-областях, решивших поднять свой профессиональный уровень. Как и в прошлом году, была возможность стажироваться удаленно: если вы не могли присутствовать у нас в офисе, работать над рядом задач вполне можно было из дома или даже из другого города. Но все-таки присутствовать лично оказалось гораздо приятнее: офисные стажеры получали не только знания и опыт, но и фирменные ништяки от Dsec :)

            image
            Фирменные кружки и секретный конверт

            Как же проходил процесс отбора? Все желающие могли заполнить электронную анкету на нашем сайте или прислать свои ответы на traineeship@dsec.ru. Удаленных стажеров отбирали, в основном, по результатам опроса в в анкете, а также на основании их ответов на некоторые дополнительные вопросы, заданные по электронной почте. С офисными стажерами мы проводили собеседования, чтобы оценить их уровень подготовки, а также предлагали им список тем, которые мы составили предварительно. Стажеры могли выбрать до трех позиций из списка. Если у кого-то из ребят была своя интересная тема, в которой он хотел бы разобраться, мы, конечно, со вниманием относились к каждому предложению.

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

            Также мы проводили разные лекции, стараясь, чтобы всем было полезно их послушать, невзирая на уровень подготовки в ИБ. Например, темы были такими:
            • Over the Garden Wall: Что интересного можно встретить в WEB (Денис Рыбин)
            • Введение в WEB, SOP (Алексей Тюрин)
            • Разведка в сетях (Алексей Перцев)
            • NFC, платежные карты, атаки на них (Егор Салтыков, Илья Булатов)
            • Лекции от коллег-реверсеров

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

            image

            В качестве наставников удалось поучаствовать в проекте почти всему отделу анализа защищенности. У каждого было по 2-3 стажера, а у некоторых даже и больше. Удар на себя приняли, например:

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

            Вопросы для мини-интервью были такими:
            1. Почему решили стажироваться именно в Digital Security? Чем привлекла вас компания?
            2. Понравилась ли стажировка? Что особенно запомнилось? Насколько реальность совпала с вашими ожиданиями?
            3. Расскажите о своей задаче/задачах.
            4. Показались ли интересными задачи, над которыми вы работали в процессе стажировки? Было ли что-то, чем вы хотели заняться, но не удалось?
            5. Готовы ли вернуться в компанию на стажировку или на работу?

            Ниже представлены ответы некоторых (не все дошли до конца и проработали свои темы) стажеров.

            Александр Романов, тема “WAF Bypass”:
            1. Меня уже достаточно давно интересует тема практической безопасности. Возможность находить уязвимости раньше, чем ими воспользуются преступные элементы, для меня кажется очень важной задачей. Компания Digital Security имеет большой опыт в проведении пентестов и исследований в области практической ИБ. Также мне очень нравится активность компании в жизни российской ИБ, в частности, организация ZeroNights.
            2. Стажировка очень понравилась своей разноплановостью. Это и создание своего проекта, и интересные лекции из всех областей практической ИБ, и практический опыт при прохождении лабораторий. Также немаловажным моментом я считаю возможность живого общения. Иногда из обычного общения о технологиях может родиться интересная идея или найтись ответ на вопрос.
            3. В мои задачи входило создание алгоритма и написание приложения для нахождения байпасов в WAF.
            4. На данный момент моя тема ещё не закончена, т.к. она оказалась обширнее, чем выглядела на первый взгляд. Я планирую значительно расширить возможности приложения. В области практической ИБ есть ещё очень много тем, которыми я бы хотел заниматься. Так что моя “стажировка” не закончится никогда.
            5. В какой-то момент прохождения стажировки я решился отправить резюме в Digital Security. И сейчас являюсь сотрудником. Отдельно хотел бы отметить прохождение собеседования. Никогда не думал, что на собеседовании можно получать новые знания или структурировать имеющиеся. За это отдельное спасибо тем, кто тогда присутствовал )

            С результатом работ можно ознакомиться здесь: https://github.com/SndVul/WAF_Bypass_Helper

            Игорь Фисенко, тема “GSM Rouge BS”:
            1. Достаточно известная компания в России с именем, проектами и специалистами, выступающими на топовых конференциях по ИБ. Думаю, выбор моей первой стажировки в жизни на данный момент очевиден.
            2. В компании дружелюбный и отзывчивый коллектив, я всегда был услышан и получал ответы на любые свои вопросы. Были созданы все условия для удобной работы стажёрам, все это подкрепили различными лекциями. Отдельное спасибо за терпение и ответы на мои глупые вопросы кураторам Илье и Глебу из отдела анализа защищенности.
            3. Так сложилось, что я работал над задачей не один, а с другим человеком. Мы пытались создать фальшивую базовую GSM станцию на BladeRF(YateBTS) и OsmocomBB для перехвата различных данных у клиентов нашей подставной сети.
            4. Поставленные задачи были очень интересны, но лично я переоценил свои возможности и не смог до конца раскрыть тему данной работы. Я выполнил определенную часть, но не смог подвести итог по реализации выполненной работы из-за недостатка времени из-за своей же ошибки. Также была тема «Социальная инженерия» с очень интересными задачами, которые для себя сохранил, хотелось бы заняться этим в ближайшем будущем.
            5. Если снова возьмут, то конечно да. Для себя нужно подтянуть свои скиллы, создать портфолио и снова вернуться к работе с новыми знаниями и силами. Компании большое спасибо.


            image
            Надстройка над базовой станцией YateBTS


            Информация о вышке, к которой удалось подключиться

            Лырчиков Игорь, тема “Уязвимости в NagiosXI”:
            1. В DSec работали и стажировались мои друзья, слышал от них только положительные отзывы, поэтому когда увидел отбор на стажировку — пошел, не задумываясь.
            2. Все было на уровне! Понравились лекции и качественный фидбек от кураторов.
            3. До стажировки имел по большей части только теоретические и поверхностные знания в области поиска web-уязвимостей, хотел зайти дальше банального поиска XSS, за которые на bb платят в среднем по 500$, и в конечном итоге не прогадал)
            4. Мы с коллегой занимались поиском уязвимостей в системе мониторинга Nagios. Поначалу была разведка и осознание бизнес-логики приложения, также анализ уже закрытых уязвимостей, а после этого стремительный прорыв: нашли несколько XSS, доработали вектор с RCE и объединили уязвимости в один вектор атаки. После этого основная задача была выполнена, отрепортили разработчикам об уязвимостях и немного позанимались задачами, изначально не входившими в наш scope. Было круто)
            5. Задания были интересными, понравился формат работы, в котором отсутствовало какое-либо давление или контроль — так что задачи решались в часы максимальной продуктивности. Даже после завершения стажировки мы продолжаем заниматься другими системами мониторинга (zabbix, prtg) и готовим по всему этому материалы для статей и конференции ZeroNights (надеюсь, нашу заявку одобрят). Так что задачи еще есть, и работы много)
            6. Странный вопрос)Конечно готовы и с большим удовольствием! Спасибо руководству, организаторам и кураторам за этот движ!



            Вывод через php шелл содержимого /etc/passwd

            Следующие 2 человека работали в одной команде и занимались общей темой - Cisco wireless technology.

            Юлия Шарафутдинова:
            1. О компании DSec я узнала больше года назад. Тогда ещё хотела попробовать пойти на стажировку, но со временем не получилось. А в этом году, когда я узнала, что можно поехать, надеялась, что возьмут именно меня)
            2. Привлекло то, что компания занимается информационной безопасностью во всех областях (как мне показалось)), а не только в одной, например, reverse инжинирингом.
            3. Стажировка очень понравилась. Ребята представили множество тем на выбор на любой вкус, как говорится. Было приятно работать со специалистами и такими же ребятами, как я. Безусловно, я получила много новой практики. Важный момент — ооочень понравилось, что проводились лекции: можно было заниматься своей темой и параллельно пробовать что-то другое.
            4. Тема стажировки у меня была — «Cisco Wireless технологии». Изначально планировалось построить сеть и изучать технологии, такие, как 802.11w, Clear Air. Но много времени ушло на администрирование (что тоже для меня интересный опыт). Был настроен wifi и получилось «поиграться» с оборудованием Cisco (реальным и виртуальным).
            5. Это был очень полезный опыт для меня. С удовольствием вернулась бы в DSec :)


            Cisco Catalyst Switch 3850

            Николай Дурникин:
            1. DSec — одна из немногих российских компаний, занимающихся информационной безопасностью. В отличие от Лаборатории Касперского является не империей-гигантом, а уютной маленькой республикой. Среди тем для стажировки я обнаружил одну, которой уже больше года интересуюсь. Собственно, два месяца стажировки я ей и посвятил.
            2. Стажировка очень понравилась. Я получил опыт работы с промышленным оборудованием, развил навыки администрирования сетей, порезвился в лабе, поиграл в настольный футбол. Один раз даже удалось попробовать неспелый грецкий орех. Стажировка превзошла все ожидания. До неё я предполагал, что куратор будет давать рутинные задания, а я слепо буду их выполнять. А вышло всё иначе — от предложенного плана можно отступать, был большой простор для самостоятельного решения нетривиальных задач.
            3. Мне нужно было изучить на предмет уязвимостей продукты, предлагаемые Cisco для администрирования больших корпоративных сетей. Для этого нужно было сначала развернуть такую сеть, потом разобраться с настройками, поиграть с ними, найти ошибки.
            4. По ходу решения задач выявилось очень много подводных камней, о которых я раньше никогда не задумывался. Каждый раз было очень интересно при решении таких проблем ставить костыли и изобретать очередной велосипед. Я остановился на установке Cisco ISE. Очень интересная система, хотелось бы её лучше изучить. Но поставить её мы так и не успели (опять-таки из-за непредвиденных проблем с образами/железом/виртуализацией).
            5. Если у меня появится свободное время, я с удовольствием вернусь в DSec.



            Общая схема стенда

            Арсений Синёв, тема “Shellshock checker tool”:
            1. DSec меня привлекла по описанию друга, который сказал, что я буду жалеть, если не зарегистрируюсь на участие в стажировке. Он знал, что мне будет интересно, и поэтому предложил.
            2. Стажировка очень понравилась, очень интересные задачи, крутой коллектив, как в самом DSec, так и среди стажеров. Особенно запомнились презентации и доклады, конечно же. Реальность совпала с ожиданиями, моя предыдущая практика была намного хуже, т.к. приходилось приходить в «офис» в 8:30 и сидеть до 5 вечера без права выходить с территории :D
            3. Тут всё просто. Программирование и Research в области уязвимости Shellshock, только и всего. Пришлось конвертировать большое количество материала и кока-колы в несколько небольших скриптов на питоне.
            4. Задачи — одни из самых интересных, какие мне только приходилось решать. Хотелось ещё заняться реверсом, но между делом я решал Crackme от FantOm, поэтому с этим проблем не было. Разработка эксплойтов и утилит для проверки уязвимостей, наверное, одна из областей в которых я мог бы преуспеть, только надо просто больше и чаще этим заниматься, а не скакать между различными областями в поисках подходящей.
            5. С радостью вернулся бы и на стажировку, и на работу, вид информационной безопасности в DSec показался мне намного интересней, чем ИБ в государственном и оборонном секторе.



            Отправка команды Ping IP-адреса, откуда был послан вредоносный запрос


            Прослушивание ответа от уязвимого хоста с помощью tcpdump

            Вывод

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

            Скоро выйдет еще одна интересная статья, уже от коллег из отдела исследований. Они подведут итоги своей стажировки и расскажут много интересного.

            Ждем всех на новую стажировку!
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/338026/


            Метки:  

            Не хочу учиться, хочу…

            Вторник, 19 Сентября 2017 г. 09:47 + в цитатник
            SmirkinDA сегодня в 09:47 Управление

            Не хочу учиться, хочу…


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

              Вообще, Parallels больше 10 лет занимается подготовкой инженеров на базе собственной кафедры МФТИ. Помимо нее, есть учебные программы на базе ВШЭ, МГТУ им.Баумана, Таллинского технического и Мальтийского университетов. Реализуется полноценная академическая программа, включающая лекции, лабораторные, научные и исследовательские работы. В активе кафедры более 600 выпускников, часть из которых работает в Parallels и родственных компаниях. Другими словами, шик, блеск, красота! Посмотрите только, какую мы лабораторию простроили к новому учебному году на базе МГТУ им.Баумана.




              Зачем все это? Сколько стоит дообучение современного программиста? И чему стоит научиться в ближайшее время? Все это в ответах директора академических программ Parallels Антона Дяйкина.



              — Как ты оцениваешь уровень образовательных программ ведущих технических вузов? Физтех, например, или Бауманка?
              — Уровень программ в вузах первой линии, к которым, безусловно, мы можем отнести МФТИ, МГТУ им.Баумана, МГУ, ВШЭ, ИТМО и еще два-три университета, которые на слуху, очень высокий. Нет смысла в плохой подготовке студентов. Выпускники не получат надлежащих знаний, не смогут устроиться в хорошие компании, авторитет вузов будет подорван. Говорить где учиться хуже, где лучше, я бы не стал, все зависит от конкретной программы и от конкретных людей.

              — Куда и на какие факультеты имеет смысл сегодня поступать? Чему стоит учиться?
              — Например, в ВШЭ есть факультет компьютерных наук. При этом, существует стереотип, что данный вуз готовит исключительно экономистов. Это не так. Это большой университет, сохранивший свое историческое наименование, которое и привязывает его к экономике. Регулярно бываю в этом вузе, встречаю там преподавателей из МФТИ, Бауманки, и даже членов Академии наук. Традиционно, уверенно чувствуют себя МФТИ, МГТУ им.Баумана. Или возьмем, например, Иннополис. Образование там стоит очень дорого (Прим. «в среднем 1,2 млн руб в год»). Тем не менее, они находят свою аудиторию. Туда приезжают люди, желающие учиться в комфортных условиях, в определенной изоляции, пусть даже дорого. Т.е. люди, которые стремятся сосредоточиться на той деятельности, которая им интересна, являющаяся основной целью их жизни. Иными словами, у каждого вуза есть своя ниша. Если говорить о программах и направлениях, то весьма популярны сейчас computer science, AI, VR.

              — На твой взгляд, как долго продлится эта популярность ИТ?
              — Максимум десять лет.

              — А потом?
              — Далее все это сойдет на нет в связи с тем, что труд программистов в том виде, в котором он сейчас существует, не будет востребован. Машины смогут обрабатывать основной массив задач. Потребуются люди, способные четко и корректно формулировать для машины задачи. Сейчас появились некоторые статьи на эту тему. В будущем IT-индустрии будут требоваться не столько сами программисты, сколько люди, совмещающие в себе гуманитарную подготовку и математическую базу, логику, способности к программированию высокого уровня. На данный момент такие люди мало востребованы. У нас вообще принято делить людей на технарей и гуманитариев. На самом деле, при правильной подготовке, в детях с малых лет можно развивать и то и другое. Я не раз встречал людей, которых школа определила в гуманитарии, но в реальности они совмещали в себе физику и лирику. Именно они способны увлечь за собой других людей, понять техническую сторону любого сложнейшего вопроса.

              — Скажи, зачем Parallels образовательные проекты?
              — Дело в том, что компания-разработчик в любом направлении занимает свою, достаточно обособленную нишу. Нет универсальных специалистов в ИТ-сфере. Есть много специализаций. Люди пишут софт под Android, iOS, macOS, Windows, WEB и тд. Узкий специалист вряд ли сможет легко и быстро переключиться между направлениями. В связи с этим, у каждой компании есть свои, достаточно специфические задачи по подготовке кадров уже со студенческой скамьи.

              Мотивация простая, если мы придем в вуз на последних курсах и будем привлекать в свои ряды обычных выпускников, придется вкладывать время и деньги в их доподготовку. Второе, работа программиста весьма специфическая, на стыке творчества, математики и логики. Это решение сложнейших и многочисленных задач. Человек, высококлассный специалист в ИТ-сфере, это необычный человек, фактически, обладающий сверхспособностями. Его нельзя просто откуда-то взять и за короткое время подготовить. Наша деятельность в МФТИ, МГТУ им.Баумана и других вузах позволяет нам работать с одаренными детьми, которые уже прошли жесточайший отбор. Это талантливые ребята, способные выполнять очень сложные задачи, что собственно, нам и требуется. И уже внутри этих вузов, благодаря тому, что у нас работает наша образовательная программа, мы из этих одаренных и талантливых людей выбираем и готовим под наши задачи тех ребят, которые нам интересны. Наверное, будет не совсем корректно так говорить, но по сути, мы выбираем лучших из лучших, тех, кто наиболее нам подходит.

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

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

              — У тебя же огромный опыт работы в академической среде. В свое время ты преподавал в ВШЭ. По роду деятельности часто встречался и встречаешься со студентами из разных вузов. В чем, на твой взгляд, слабые стороны современных студентов?
              — Как я уже говорил, практически во всех вузах, с которыми мы работаем, очень жесткий отбор. Студенты в большинстве случаев – яркие, талантливые люди. При этом, если говорить о слабых сторонах, то я бы отметил неспособность некоторых ребят фокусироваться на чем-либо продолжительное время. Вузы заинтересованы в том, чтобы студенты участвовали в разнообразных конкурсах, чемпионатах и прочих соревнованиях. Чтобы они выигрывали и побеждали. Это огромная имиджевая составляющая для вуза. Для решения подобных задач требуются вполне определенные навыки. Поэтому часть образовательных программ нацелена на развитие соревновательных навыков. Ребят готовят к решению сложных, но непродолжительных по времени задач. Это, как учить человека очень быстро решать ребусы или математические задачи. Если это продолжается на протяжении нескольких лет, то потом такому человеку просто не интересно работать над долгосрочными и тяжелыми тематиками. Это то, с чем мы сталкиваемся сегодня. Несмотря на наличие казалось-бы определенной базы интересных нам специалистов, далеко не все они способны к совместному марафону.

              — Так в чем проблема?
              — Наша компания работает с операционными системами, с очень сложными задачами, для решения которых, иногда требуется от нескольких месяцев до нескольких лет. К примеру, наш основной продукт, Parallels Desktop, достаточно большой и сложный внутри. Многие работы связаны с отладкой и актуализацией операционных систем в соответствии с постоянными изменениями. Это тяжелые и долгоиграющие вопросы, над которыми необходимо качественно и системно работать.

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

              — А как много тех, которые учились, но не дошли до конца?
              — Подобное случается, но крайне редко. В наших группах такое практически не случается?

              — Почему? Вытягиваете?
              — Нет. В прошлом выпуске был студент-льготник, который начинал хорошо, но потом потерял интерес к учебе и сейчас ушел в академический отпуск. Это абсолютное исключение из правил. Все остальные ребята, которых отбирает МФТИ, те кто приходит туда учится, еще со школьной скамьи понимают куда они идут. Они очень замотивированные. Ребята готовы трудится много. МФТИ – особый вуз. Он еще и находится отдельно от городской среды. Фактически кампус, со своей атмосферой, способствующей образовательному процессу.

              — А отличаются современные студенты от студентов пяти или десятилетней давности?
              — Безусловно. Скажем на рубеже двухтысячных многие хотели быть бандитами. Был даже какой-то ореол героизма над представителями этой категории граждан. По прошествии времени, даже те, кто когда-то подходил под определение «криминал», хотят для своих детей качественного образования в серьезных вузах. Эта тенденция заметна в целом по стране. Далеко не все способны реализовать свои желания. Несмотря на то, что ЕГЭ облегчил поступление талантливых детей в вузы. Тем не менее, для того, чтобы соответствовать требованиям этих учебных заведений и учиться в них, нужно получить базовую подготовку еще в школе, а далеко не везде это получается. Вообще если брать студентов вузов «первой линии», о которых я говорил ранее, это очень мотивированные люди, готовые учиться днем и ночью. Что собственно они и делают.

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

              — А что касается самого образовательного процесса?
              — На самом деле, можно говорить о том, что, приходя в компанию после выпуска из обычного рядового вуза, бывший студент использует процентов 20 знаний данных ему в университете. Все остальное – практика. В случае с МФТИ все несколько иначе. Есть базовая, академическая подготовка, в течение двух лет и далее в течение двух-четырех лет – это обучение на базовой кафедре с четкой привязкой к конкретному направлению, предприятию или компании. Базовые кафедры имеют специализацию, направленную на подготовку специалистов, востребованных в этих компаниях. Это реально практикоориентированное обучение.

              — В заключении хотелось бы спросить, кому будет сложно на базовой кафедре Parallels?
              — Не скажу чего-то нового, наверное. Людям не готовым ориентироваться на высочайшее качество своего труда у нас будет невыносимо. Второй момент, на который стоит обратить внимание – это способность работать в команде. Многие задачи требуют коллективных усилий. Это как в футболе, команде нужны звезды, но даже они без партнеров на поле бессильны. Еще от вас потребуется усидчивость и способность долговременно над чем-то работать.

              З.Ы. Про кафедру можно почитать здесь.

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

              https://habrahabr.ru/post/338194/


              Метки:  

              Кодирование Arduino для температурного датчика TMP102

              Вторник, 19 Сентября 2017 г. 09:43 + в цитатник
              Scorobey сегодня в 09:43 Разработка

              Кодирование Arduino для температурного датчика TMP102

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

                Для отработки различных вариантов кодов будем использовать датчик температуры TMP102. Посмотрим, что получится и разберем отличия в реализации кодов.

                Температурный датчик TMP102 [1] является одним из широко используемых цифровых датчиков для измерения температуры окружающей среды. Поэтому, собственно, на нем и остановим выбор.



                Замечу, что у датчика TMP102 может быть разное расположение выводов по сравнению с показанным на изображении. Датчик TMP102 поддерживает протокол I2C и оснащен выводами SDA и SCL.

                Подключим аналоговые контакты 4 и 5 вашей платы Arduino Uno к выводам SDA и SCL датчика TMP102. Также подключим +5 В и заземление, как показано на следующей схеме.

                В этом статье мы используем плату Arduino Uno в качестве ведущего, а TMP102 — как подчиненную периферию, где адрес части TMP102 равен 0x48 в шестнадцатеричном формате:



                Теперь подключим свою плату Arduino к компьютеру с помощью USB-кабеля и создадим новый скетч в интегрированной среде Arduino, используя следующий фрагмент кода:

                Serial Monitor:
                #include 
                int partAddress = 0x48;
                
                void setup(){
                  Serial.begin(9600);
                  Wire.begin();
                }
                
                void loop(){
                
                  Wire.requestFrom(partAddress,2);
                byte MSB = Wire.read();
                  byte LSB = Wire.read();
                
                  int TemperatureData = ((MSB << 8) | LSB) >> 4;
                
                  float celsius = TemperatureData*0.0625;
                  Serial.print("Celsius: ");
                  Serial.println(celsius);
                
                  float fahrenheit = (1.8 * celsius) + 32;
                  Serial.print("Fahrenheit: ");
                  Serial.println(fahrenheit);
                
                  delay(500);
                }
                


                Теперь можем увидеть показания температуры в градусах Цельсия и Фаренгейта в окне.
                В предыдущем фрагменте кода функция Wire.requestFrom (partAddress, 2) запрашивает два байта из ведомого TMP102. Ведомое устройство передает байты данных ведущему устройству, которые захватываются функцией Wire.read () и сохраняются в виде двух разных битов: старший бит (MSB) и младший бит (LSB).

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

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

                Несмотря на то, что в различных проектах DIY простые фотоэлементы используются в качестве дешевой альтернативы, датчик BH1750 известен высоким разрешением и точностью в широком диапазоне применений. Окружающий свет, также называемый световым потоком или люксом, измеряется в единичном просвете.

                Датчик BH1750 поддерживает связь I2C с адресом части 0x23, с 0x5C в качестве вторичного адреса, если вы используете несколько датчиков BH1750. Ниже представлен образ типичной вскрывающей панели, состоящей из BH1750:



                Выводы SDA и SCL платы BH1750 подключим к аналоговым выводам 4 и 5 платы Arduino Uno, как показано на следующей принципиальной схеме. Также заполним соединения +5 В и заземление, как показано на следующей схеме:



                Хотя BH1750 является простым и удобным датчиком I2C, в случае сенсора с множеством возможностей измерения кодирование напрямую с использованием библиотеки Wire нецелесообразно.

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

                Для BH1750 мы продемонстрируем использование такой библиотеки для кодирования I2C. Прежде чем использовать эту библиотеку, придется импортировать ее в Arduino IDE.

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

                После перезапуска Arduino IDE перейдите в меню File | Примеры | BH1750 и откройте скетч Arduino BH1750test. Это должно открыть следующий фрагмент кода в Arduino IDE.

                Настройте соответствующий последовательный порт и загрузите его на плату Arduino. Как только код будет выполнен, вы сможете проверить значения светового потока (lux), используя последовательный монитор среды разработки Arduino. Убедитесь, что серийный монитор настроен на скорость 9600 бод:

                #include 
                #include 
                
                BH1750 lightMeter;
                
                void setup(){
                  Serial.begin(9600);
                  lightMeter.begin();
                  Serial.println("Running...");
                }
                
                void loop() {
                  uint16_t lux =
                lightMeter.readLightLevel();
                  Serial.print("Light: ");
                  Serial.print(lux);
                  Serial.println(" lx");
                  delay(1000);
                }
                


                Как видно из предыдущего фрагмента кода, мы импортировали библиотеку BH1750, включив файл BH1750.h с помощью Wire.h. Эта библиотека предоставляет функцию readLightLevel (), которая будет получать значение окружающего света от датчика и предоставлять его как целое число.

                Поскольку код Arduino работает в цикле с задержкой в 1000 миллисекунд, значения lux будут выбираться с датчика и посылаться в последовательный порт каждую секунду. Наблюдать эти значения в окне Serial Monitor.

                PyMata для быстрого прототипирования I2C


                Мы использовали pyFirmata в качестве нашей библиотеки Python по умолчанию для взаимодействия с протоколом Firmata. Хотя pyFirmata поддерживает режимы аналогового, цифрового, PWM и SERVO с простыми в использовании методами, он обеспечивает ограниченную поддержку протокола I2C.

                В этой статье используем другую библиотеку Python Firmata под названием PyMata.
                Библиотека PyMata поддерживает регулярные методы Firmata, а также обеспечивает полную поддержку протокола обмена сообщениями I2C. PyMata можно легко установить с помощью Setuptools:
                C: \> easy_install.exe pymata
                C:\Users\Oleg>pip install pymata #так надо!


                Если вы используете Linux или Mac OS X, используйте следующую команду в терминале, чтобы установить библиотеку PyMata:
                $ Sudo pip install pymata


                Если все настроено правильно, этот процесс завершится без ошибок. Вы можете подтвердить PyMata, открыв интерактивную подсказку Python и импортировав PyMata:
                >>> import PyMata


                Взаимодействие TMP102 с использованием PyMata


                Чтобы использовать функции PyMata, понадобится, чтобы плата Arduino была оснащена прошивкой firmata стандартного firmata, как и библиотека pyFirmata. Прежде чем приступить к объяснению функций PyMata, сначала запустим следующий фрагмент кода. Подключим датчик температуры TMP102, как описано выше.

                С помощью Arduino IDE перейдем в меню Файл | Примеры | Firmata и загрузим стандартный скетч Firmata оттуда в свою плату Arduino. Теперь создадим исполняемый файл Python, используя следующий фрагмент кода. Изменим значение порта (COM5), если необходимо, на соответствующее имя порта, как того требует ваша операционная система.

                import time
                from PyMata.pymata import PyMata
                
                #Initialize Arduino using port name
                port = PyMata("COM5")
                
                #Configure I2C pin
                port.i2c_config(0, port.ANALOG, 4, 5)
                
                # One shot read asking peripheral to send 2 bytes
                port.i2c_read(0x48, 0, 2, port.I2C_READ)
                # Wait for peripheral to send the data
                time.sleep(3)
                
                # Read from the peripheral
                data = port.i2c_get_read_data(0x48)
                
                # Obtain temperature from received data
                TemperatureSum = (data[1] << 8 | data[2]) >> 4
                
                celsius = TemperatureSum * 0.0625
                print celsius
                
                fahrenheit = (1.8 * celsius) + 32
                print fahrenheit
                
                firmata.close()
                


                При выполнении предыдущего фрагмента кода можно увидеть показания температуры в градусах Фаренгейта и Цельсия.

                Как можно видеть из встроенных комментариев в коде, первым шагом для использования Arduino с помощью PyMata является инициализация порта с помощью конструктора PyMata.

                PyMata поддерживает конфигурацию контактов I2C через функцию i2c_config (). PyMata также поддерживает одновременные операции чтения и записи с помощью функций i2c_read () и i2c_write ().

                Взаимодействие BH1750 с использованием PyMata


                В случае BH1750 предыдущий фрагмент кода PyMata можно использовать с небольшими изменениями, чтобы получить данные датчика внешней освещенности. В качестве первого изменения можно заменить адрес части TMP102 (0x48) на экземпляр BH1750 (0x23) в следующем фрагменте кода.

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

                import time
                from PyMata.pymata import PyMata
                
                port = PyMata("COM5")
                port.i2c_config(0, port.ANALOG, 4, 5)
                
                # Request BH1750 to send 2 bytes
                port.i2c_read(0x23, 0, 2, port.I2C_READ)
                # Wait for BH1750 to send the data
                time.sleep(3)
                
                # Read data from BH1750
                data = port.i2c_get_read_data(0x23)
                
                # Obtain lux values from received data
                LuxSum = (data[1] << 8 | data[2]) >> 4
                
                lux = LuxSum/1.2
                print str(lux) + ' lux'
                
                firmata.close()
                


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

                Команды pySerial



                Стандартный протокол Firmata и библиотеки Firmata от Python очень полезны для тестирования или быстрого прототипирования датчиков I2C.

                Хотя у них есть много преимуществ, проекты, основанные на Firmata, сталкиваются со следующими недостатками: задержка в режиме реального времени, ограниченная поддержка.

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

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

                Соединение с последовательным портом


                После подключения вашего Arduino к USB-порту компьютера можно открыть порт в своем Python-коде, используя серийный класс, как показано в следующем примере кода:
                import serial
                port = serial.Serial('COM5',9600, timeout=1)


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

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

                После того как последовательный порт открыт можно начать чтение порта с помощью readline (). Функция readline () требует указания таймаута при инициализации порта, иначе код может завершиться с исключением:
                line = port.readline()


                Функция readline () будет обрабатывать каждую строку из порта, которая заканчивается символом конца строки \ n.

                При работе с pySerial необходимо очистить входной буфер, чтобы избежать переполнения буфера и поддерживать операции в реальном времени:
                port.flushInput()


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

                Это хорошая практика кодирования для закрытия последовательного порта после завершения процесса. Эта практика может устранить проблему блокировки порта после завершения кода Python:
                port.close()


                Выводы


                Работа знакомит пользователей с различными шаблонами кода прототипов с практическими приложениями. Эти шаблоны создания прототипов помогли изучить новые парадигмы программирования Python и методы Firmata. На примерах рассмотрены концепции программирования с предоставлением быстрых шаблонов программирования.

                Литература


                1. Датчик температуры TMP102.
                2. Книга: «Arduino Basic Connections».
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/337988/


                Метки:  

                Философия статического анализа кода: три простых шага

                Вторник, 19 Сентября 2017 г. 09:42 + в цитатник
                EvgeniyRyzhkov сегодня в 09:42 Управление

                Философия статического анализа кода: три простых шага

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

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



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

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

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

                  Стоит ли использовать статический анализ вместо других методологий? Статический анализ — это не панацея от всех бед! Его нельзя начать использовать вместо юнит-тестов или code review. Статический анализ — это ответ на вопрос: «А что ещё мы можем сделать, чтобы наш код был лучше?». Что значит лучше? Легче поддерживать, проще развивать, быстрее устранять проблемы. Если ваша компания зарабатывает деньги используя программный код вы просто не можете не использовать статический анализ кода.
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338220/


                  Метки:  

                  AStA: собираем APK на самом устройстве

                  Вторник, 19 Сентября 2017 г. 01:07 + в цитатник
                  jatx сегодня в 01:07 Разработка

                  AStA: собираем APK на самом устройстве

                    Что такое AStA? Это акроним от «Android Studio on Android». Это метод, позволяющий собирать проекты Android Studio на Android устройстве с помощью chroot/Debian, JDK, Android SDK и Gradle.
                    Зачем это вообще нужно? Да мало ли, зачем… Бывает, например, хочется проверить какую-то идею, а декстопа под рукой нет. В общем, пусть на вопрос «зачем» каждый ответит для себя сам.
                    Какие существуют альтернативы? Из существующих решений мне известно только AIDE, но у него есть свои минусы. Во-первых, постоянно выскакивает окошко с предложением проапгрейдить версию за 600 рублей, а если этого не сделать, то нельзя сохранять проекты, состоящие из более чем 5 файлов. Во-вторых, AIDE не поддерживает сборку проектов Android Studio, состоящих из более, чем одного модуля.


                    Что нам потребуется?



                    1. Устройство с ядром Android, совместимым с Debian Stretch.
                    2. Наличие на root-прав на устройстве.
                    3. 4 ГБ свободного места на карте памяти под образ Debian.
                    4. Заранее установленный на устройстве Busybox.
                    5. Desktop с Debian на борту + adb (в случае установки через скрипт).

                    Установка через скрипт



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

                    #!/bin/sh
                    # Чтобы не спрашивало пароль в середине скрипта:
                    sudo echo 'installDebianOnAndroid script started'
                    # Архитектура устройства
                    ARCH=armhf
                    # Версия Debian
                    DEBIAN_VERSION=stretch
                    # Путь к карте памяти на устройстве:
                    STORAGE=/sdcard
                    # Место, где мы создадим образ на декстопе:
                    DATA_DRIVE=/Data
                    # Для совместимости с файловой системой FAT32 
                    # размер файла образа не должен превышать (2^32 - 1) байт
                    BS=1M
                    COUNT=4095
                    # Создаем файл образа:
                    dd if=/dev/zero of=$DATA_DRIVE/debianOnAndroid.img bs=$BS count=$COUNT
                    # Создаем точку монтирования на десктопе:
                    mkdir -p ~/debianOnAndroid
                    # Создаем на образе файловую систему:
                    sudo mkfs.ext3 $DATA_DRIVE/debianOnAndroid.img
                    # Монтируем образ:
                    sudo mount -o user,loop,exec,dev $DATA_DRIVE/debianOnAndroid.img ~/debianOnAndroid/
                    # С помощью debootstrap создаем на образе debian:
                    sudo debootstrap --verbose --arch $ARCH --foreign $DEBIAN_VERSION ~/debianOnAndroid/ http://ftp.se.debian.org/debian
                    # Размонтируем образ:
                    sudo umount $DATA_DRIVE/debianOnAndroid.img
                    # Кладем образ на карту памяти:
                    adb push $DATA_DRIVE/debianOnAndroid.img $STORAGE
                    # Busybox лучше заранее установить через приложение:
                    # https://play.google.com/store/apps/details?id=stericson.busybox
                    #adb push busybox/busybox-armv6l /sdcard/busybox
                    #adb shell su -c cp /sdcard/busybox /data/local/busybox
                    #adb shell su -c chmod 755 /data/local/busybox
                    # Создаем папки AStA на Android:
                    adb shell mkdir -p $STORAGE/AStA
                    adb shell mkdir -p $STORAGE/AStA/Projects
                    adb shell mkdir -p $STORAGE/AStA/archives
                    adb shell mkdir -p $STORAGE/AStA/scripts
                    # Скрипт для первого монтирования и настройки Debian
                    adb push firstMountAndConfigureDebian.sh $STORAGE/AStA/scripts
                    # Скрипты для монтирования и размонтирования
                    adb push mountDebian.sh $STORAGE/AStA/scripts
                    adb push umountDebian.sh $STORAGE/AStA/scripts
                    # Заранее приготовленные архивы JDK, Android SDK и gradle
                    ANDROID_SDK_TAR_GZ=android-sdk-linux.tar.gz 
                    JDK_8_TAR_GZ=jdk-8u144-linux-arm32-vfp-hflt.tar.gz
                    GRADLE_ZIP=gradle-3.5-bin.zip
                    # Кладем архивы в папку AStA/archives на карте памяти:
                    adb push archives/$ANDROID_SDK_TAR_GZ $STORAGE/AStA/archives
                    adb push archives/$JDK_8_TAR_GZ $STORAGE/AStA/archives
                    adb push archives/$GRADLE_ZIP $STORAGE/AStA/archives
                    # Скрипт для запуска команд Gradle:
                    adb push gradleExec.sh $STORAGE/AStA/scripts
                    # Запускаем скрипт первоначальной настройки Debian:
                    adb shell su -c sh $STORAGE/AStA/scripts/firstMountAndConfigureDebian.sh
                    # Размонтируем образ:
                    adb shell su -c sh $STORAGE/AStA/scripts/umountDebian.sh
                    # Имя файла приложения:
                    ASTA_APP_APK=AStA-app.apk 
                    # Кладем приложение в папку AStA и устанавливаем:
                    adb push apk/$ASTA_APP_APK $STORAGE/AStA
                    echo 'installing AStA-app'
                    adb shell pm install -r $STORAGE/AStA/$ASTA_APP_APK
                    echo 'installDebianOnAndroid script done'
                    


                    Скрипт настройки Debian на устройстве:

                    echo 'firstMountAndConfigureDebian script started'
                    # Пароль для доступа по SSH:
                    PASSWORD=1234567
                    # Точка монтирования Debian:
                    MNTPT=/data/local/debianOnAndroid
                    # Путь к карте памяти:
                    STORAGE=/sdcard
                    # Образ Debian:
                    IMG_FILE=$STORAGE/debianOnAndroid.img
                    # Версия Debian:
                    DEBIAN_VERSION=stretch
                    # Создаем точку монтирования:
                    mkdir -p $MNTPT
                    # Монтируем образ:
                    busybox mount -o loop $IMG_FILE $MNTPT
                    # Нужно для корректной работы chroot:
                    export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/system/bin:/system/xbin:/su/bin:/su/xbin
                    # Второй этап debootstrap:
                    chroot $MNTPT /debootstrap/debootstrap --second-stage
                    # Настраиваем apt:
                    echo "deb http://ftp.se.debian.org/debian $DEBIAN_VERSION main contrib non-free" > $MNTPT/etc/apt/sources.list
                    # Монтируем:
                    busybox mount -t proc none $MNTPT/proc
                    busybox mount -t sysfs none $MNTPT/sys
                    busybox mount -o bind /dev $MNTPT/dev
                    busybox mount -t devpts none $MNTPT/dev/pts
                    export TMPDIR=/tmp
                    #chroot $MNTPT /bin/bash
                    # Чтобы apt мог работать с сетью, нужно перевести его в группу Internet (3003)
                    chroot $MNTPT sed -i 's#_apt:x:104:65534::/nonexistent:/bin/false#_apt:x:104:3003::/nonexistent:/bin/false#' /etc/passwd
                    # Устанавливаем пакеты, которые нам понадобятся:
                    chroot $MNTPT apt-get update
                    chroot $MNTPT apt-get --yes upgrade
                    chroot $MNTPT apt-get --yes install ne openssh-server unzip \
                     android-sdk-build-tools android-sdk-platform-tools
                    # Устанавливаем пароль для доступа по SSH:
                    echo "echo 'root:$PASSWORD' | chpasswd" > $MNTPT/root/setpasswd.sh
                    chroot $MNTPT /bin/sh /root/setpasswd.sh
                    cat $MNTPT/root/setpasswd.sh
                    # Заменяем строчку в конфиге SSH, чтобы работал доступ под root'ом:
                    chroot $MNTPT sed -i '/PermitRootLogin without-password/c\PermitRootLogin yes' /etc/ssh/sshd_config 
                    chroot $MNTPT /etc/init.d/ssh restart
                    # Создаем папку AStA в Debian и монтируем на нее папку Android:
                    mkdir -p $MNTPT/AStA
                    busybox mount -o bind $STORAGE/AStA $MNTPT/AStA
                    # Имена файлов архивов:
                    ANDROID_SDK_TAR_GZ=android-sdk-linux.tar.gz
                    JDK_8_TAR_GZ=jdk-8u144-linux-arm32-vfp-hflt.tar.gz
                    GRADLE_ZIP=gradle-3.5-bin.zip
                    # Распаковываем архивы:
                    chroot $MNTPT tar -xzvf /AStA/archives/$ANDROID_SDK_TAR_GZ -C /opt 
                    chroot $MNTPT tar -xzvf /AStA/archives/$JDK_8_TAR_GZ -C /opt
                    chroot $MNTPT unzip /AStA/archives/$GRADLE_ZIP -d /opt
                    #
                    echo 'firstMountAndConfigureDebian script done'
                    


                    Запуск установки через скрипт



                    Чтобы установить на устройство образ Debian, приложение и все необходимые скрипты, нужно выполнить следующую последовательность действий:

                    git clone https://github.com/tabatsky/AStA.git
                    cd AStA/scripts
                    # Подправить переменные в скрипте start.sh
                    sh start.sh
                    


                    Так же можно скачать готовый образ Debian (под armhf) здесь, либо скачать через приложение.

                    Подключение и отключение Debian



                    Следующий скрипт монтирует Debian и запускает ssh, а также монтирует папку AStA с устройства на Debian:

                    MNTPT=/data/local/debianOnAndroid
                    STORAGE=/sdcard
                    IMG_FILE=$STORAGE/debianOnAndroid.img
                    mkdir -p $MNTPT
                    busybox mount -o loop $IMG_FILE $MNTPT
                    export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/system/bin:/system/xbin:/su/bin:/su/xbin
                    busybox mount -t proc none $MNTPT/proc
                    busybox mount -t sysfs none $MNTPT/sys
                    busybox mount -o bind /dev $MNTPT/dev
                    busybox mount -t devpts none $MNTPT/dev/pts
                    export TMPDIR=/tmp
                    #chroot $MNTPT bash
                    chroot $MNTPT /etc/init.d/ssh start
                    mkdir -p $STORAGE/AStA
                    mkdir -p $MNTPT/AStA
                    busybox mount -o bind $STORAGE/AStA $MNTPT/AStA
                    


                    А этот, соответственно, останавливает ssh и все размонтирует:

                    MNTPT=/data/local/debianOnAndroid
                    export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/system/bin:/system/xbin:/su/bin:/su/xbin
                    busybox umount $MNTPT/AStA
                    chroot $MNTPT /etc/init.d/ssh stop
                    busybox umount $MNTPT/dev/pts
                    busybox umount $MNTPT/dev
                    busybox umount $MNTPT/proc
                    busybox umount $MNTPT/sys
                    busybox umount $MNTPT
                    


                    Запустить данные скрипты можно через shell:

                    su -c sh /sdcard/AStA/scripts/mountDebian.sh  
                    su -c sh /sdcard/AStA/scripts/umountDebian.sh  
                    


                    Либо можно просто нажать на соответствующую кнопку в приложении.

                    Запуск команд Gradle



                    Запустить сборку Gradle можно, подключившись по ssh, и запустив следующую команду:

                     sh /AStA/scripts/gradleExec.sh /AStA/Projects/MyProject/myModule/ myCmd
                    # Например:
                     sh /AStA/scripts/gradleExec.sh /AStA/Projects/AStA-app/app/ assembleDebug
                    


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

                    Ограничения



                    1. В файле build.gradle проекта должна быть указана версия 'com.android.tools.build:gradle': 2.2.*;
                    2. В файлах build.gradle всех модулей должна быть указана buildToolsVersion == 24.0.0;
                    3. В файлах build.gradle всех модулей должна быть указана compileSdkVersion <= 24.

                    На этом у меня все



                    Все скрипты, а также исходный код приложения, можно найти здесь:
                    github.com/tabatsky/AStA

                    В качестве заключения хочу сказать, что этим методом мне удалось успешно собрать само приложение AStA-app.

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

                    https://habrahabr.ru/post/338216/


                    Метки:  

                    Режем XML по разметке XQuery

                    Понедельник, 18 Сентября 2017 г. 23:15 + в цитатник
                    sshmakov сегодня в 23:15 Разработка

                    Режем XML по разметке XQuery

                      Для работы с web-сервисами традиционно используется SoapUI от SmartBear Software. Отличный инструмент и к тому же бесплатный. Но… это инструмент разработчика, тестировщика, архитектора, но никак не ориентированный на работу конечного пользователя.

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



                      Чтобы обратиться к web-сервису существует огромное количество способов. В Python есть requests (статьи на Хабре 1, 2), но я буду использовать средства Qt, отчасти по привычке, отчасти для уменьшения зависимостей, так как PyQt5 уже подключен, отчасти для уменьшения промежуточных преобразований данных. Соответственно, для преобразования полученного xml-ответа использую XPath и XQuery, так же заложенные в Qt.

                      Подключаться будем к сервису курса валют Банка России. Сервис по ссылке отвечает таким XML:
                      
                      
                        
                          036
                          AUD
                          1
                          Австралийский доллар
                          46,0614
                        
                        ...
                      

                      В параметрах передается дата формата ДД/ММ/ГГГГ, ее можно не указывать, тогда курсы будут на текущий день.

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

                      Первым делом напишем такой файл конфигурации, определяющий сервис, его параметры и способ показа:

                      [Input]
                      ; Показать на экране поле ввода даты
                      Date=Дата,02/03/2017
                      
                      [WebPage]
                      ; Ссылка на сервис с подставляемым параметром
                      Url="http://www.cbr.ru/scripts/XML_daily.asp?date_req={Date}"
                      ; Шаблон, которым будет преобразовываться ответ
                      Transform=valcurs.xq
                      

                      Подставлять параметры в url можно было по разному. Традиционный способ в Qt — это QString::arg() в Qt, но он недоступен в PyQt5 из-за отсутствия QString. В Python есть оператор % и метод str.format() (про него тоже имеется статья на Хабре). Поскольку параметры нам нужны именованные, то подстановка должна быть тоже именованной — такой способ дает str.format(). Отсюда параметр Date в фигурных скобках.

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

                      Можно оставить иерархию тэгов и отобразить ее в QTreeWidget. Ага, но только тогда мы получим типа «понятное представление» как в просмотрщике событий Win.



                      Исключительно понятное.

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

                      Для показа веб-страниц в Qt есть модуль QWebEngineView – по сути, встроенный Chromium. Раньше был WebKit, проще и куда более интегрированный в Qt, но под влиянием моды на HTML5 разработчики отказались от его поддержки во фреймворке. Taк что живем с чем есть.

                      Соберем рабочее окно по аналогии с окном SQL, описанным в первой части, только вместо QTableView добавим QWebEngineView. Получится такое окно



                      Если у вас не запустилось...
                      … и вы в Windows, то причиной может быть невозможность инициализации OpenGL в модуле QtWebEngine, т.к. Chromium, в отличие от WebKit-а, шибка умный, однако, и требует OpenGL.

                      Под Windows есть три варианта работы:
                      — 'desktop' — прямые вызовы «нативного» OpenGL
                      — 'angle' — через опенсорсную прослойку ANGLE от Google, транслирующую вызовы OpenGL в вызовы DirectX.
                      — 'software' — через программную реализацию OpenGL

                      Вариант работы определяется через переменную окружения QT_OPENGL, которую надо установить до создания QGuiApplication.

                          os.environ.putenv('QT_OPENGL','software') # desktop, software, angle
                      


                      Если переменная не определена, то PyQt5 (по крайней мере, та сборка, что у меня) пытается сам определить способ работы. И… не всегда это ему удается, и тогда приложение вылетает.

                      Наиболее надежно работает 'software', только нужно скачать соответствующую dll отсюда (я брал opengl32sw-32.7z), распаковать и положить рядом с библиотеками Qt (...\Lib\site-packages\PyQt5\Qt\bin\).

                      Для 'angle' нужны d3dcompiler_4x.dll, которые берутся здесь. Если всё же не взлетает, то можно отключить обращение к DirectX:

                          os.environ.putenv('QT_ANGLE_PLATFORM','warp') # d3d11, d3d9 and warp
                      

                      И даже в этом случае может выскочить сообщение
                      QtWebEngineProcess.exe - Системная ошибка
                      ---------------------------
                      Запуск программы невозможен, так как на компьютере отсутствует VCRUNTIME140.dll. Попробуйте переустановить программу.


                      Этот файл входит в Visual C++ Redistributable for Visual Studio 2015, скачать можно отсюда.

                      Вот теперь всё должно работать.

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

                                 # Создадим один раз менеджер
                                 self.man = QNetworkAccessManager(self)
                      
                          # Кнопка Run
                          def run(self):
                              try:
                                  # Считаем введенные параметры
                                  values = { kp[0]:self.inputs[kp[0]].text() for kp in self.params}
                                  url = self.url.format(**values)
                                  req = QNetworkRequest(QUrl(url))
                                  # Вызовем GET
                                  reply = self.man.get(req)
                                  reply.finished.connect(self.replyFinished)
                      

                      В последней строке к сигналу finished подключается функция-обработчик ответа, в терминах Qt «слот», в котором исходный объект QNetworkReply получим из QObject.sender().

                          def replyFinished(self):
                              reply = self.sender()
                      

                      К моменту вызова этой функции из reply можно вычитывать данные, как из файла.

                      Над выбором шаблонизатора тоже долго думать не пришлось – хоть их и много (wiki, обзор), и на JS, и на Python, естественно использовать уже установленный – в Qt есть QXmlQuery, поддерживающий XQuery и таблицы преобразования XSLT, правда с ограничениями.

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

                      xquery version "1.0" encoding "utf-8";
                      
                        
                        
                        
                        
                          
                      Курсы ЦБ на {string(/ValCurs/@Date)}
                      {for $i in /ValCurs/Valute return ( ) }
                      Код валюты Код валюты Номинал Название Курс
                      {string($i/NumCode)} {string($i/CharCode)} {string($i/Nominal)} {string($i/Name)} {string($i/Value)}

                      Теперь осталось прогнать ответ через шаблон и результат вставить в веб-страницу. Удобно, что можно передать QXmlQuery основной документ не буфером, а источником на основе QIODevice. Наш ответ для этого вполне годится.

                                  # Создаем объект
                                  lang = QXmlQuery.XQuery10
                                  query = QXmlQuery(lang)
                                  query.setMessageHandler(XmlQueryMessageHandler())
                                  query.setFocus(reply)
                      
                                  # Начитываем шаблон из файла
                                  templ = QFile(self.transformTemplate)
                                  templ.open(QIODevice.ReadOnly)
                                  query.setQuery(templ)
                      
                                  # Результат преобразуем в строку и вставим в веб-страницу
                                  out = query.evaluateToString()
                                  self.page.setHtml(out)
                      

                      Соберем все вместе и запустим. Работает ли? Увы, чуда опять не случилось, работает, конечно.



                      Вместо XQuery можно использовать XSL-таблицы. Всего-то потребуется поменять одну строчку

                                      lang = QXmlQuery.XSLT20
                      


                      xmlview.xslt
                      
                      
                      
                      
                      
                          
                            
                            
                              
                            
                            
                            

                      Transformed XML

                      < ="">>



                      Получается так


                      А что, если отдать полученный XML без шаблона напрямую в страницу?

                              b = reply.readAll()
                              self.page.setContent(b, reply.header(QNetworkRequest.ContentTypeHeader), reply.url())
                      

                      Chromium сумеет показать этот XML.



                      Кодировка нарушилась, потому что сервис ЦБ не прописал кодовую страницу в заголовке ответа HTTP, а разбирать заголовок XML Chromium не стал. Добавим принудительное добавление кодовой страницы по умолчанию.

                              b = reply.readAll()
                              cth = reply.header(QNetworkRequest.ContentTypeHeader)
                              if len(cth.split(';')) == 1:
                                  cth = cth + ";charset=windows-1251"
                              self.page.setContent(b,cth,reply.url())
                      




                      Теперь все хорошо.

                      Осталось только добавить новый модуль в общий набор инструментов. Исходный код лежит на github.
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/338060/


                      Метки:  

                      [Перевод - recovery mode ] Angular vs. React vs. Vue: Сравнение 2017

                      Понедельник, 18 Сентября 2017 г. 22:25 + в цитатник
                      Synoptic вчера в 22:25 Разработка

                      Angular vs. React vs. Vue: Сравнение 2017

                      Выбор JavaScript-фреймворка для вашего веб-приложения может быть невыносим. В настоящее время очень популярны Angular и React, и есть также выскочка, получающий много внимания в последнее время: VueJS. Кроме них, лишь эти несколько новичков.



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


                      Прежде чем начнем — SPA или нет?


                      Сперва вы должны принять четкое решение, нужно ли вам одностраничное веб-приложение(SPA), или вы предпочли бы многостраничный подход. Больше на эту тему в моем посте “Одностраничные веб-приложения(SPA) против Многостраничных веб-приложений(MPA)”(скоро выйдет, следите за обновлениями в Twitter).


                      Участники сегодняшнего состязания: Angular, React and Vue


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


                      Вопросы, которые мы сегодня рассмотрим:


                      • Насколько зрелые эти фреймворки/библиотеки?
                      • Будут ли эти фреймворки существовать еще какое-то время?
                      • Насколько велики и полезны сообщества вокруг них?
                      • Насколько легко найти разработчиков под каждый из этих фреймворков?
                      • Каковы основные идеи этих фреймворков?
                      • Насколько просто использовать эти фреймворки для небольших и крупных веб-приложений?
                      • Какова кривая обучения для каждого из фреймворков?
                      • Какую производительность вы ожидаете от этих фреймворков?
                      • Где вы можете подробнее узнать, что у них под капотом?
                      • Как начать разрабатывать с выбранным фреймворком?

                      На старт, внимание, марш!


                      Жизненный цикл и стратегические соображения



                      React vs. Angular vs. Vue


                      1.1 Немного истории


                      Angular — это JavaScript-фреймворк, основанный на TypeScript. Разработанный и поддерживаемый Google, он описывается как “Супергеройский JavaScript MVW фреймворк”. Angular(известный также как “Angular 2+”, “Angular 2” или “ng2”) — переписанный, по большей части несовместимый преемник AngularJS(известный как “Angular.js” или “AngularJS 1.x”). Хотя AngularJS(старый) был впервые выпущен в октябре 2010-го, он до сих пор получает багфиксы и т.д. Новый Angular(без JS) был представлен как версия №2 в сентябре 2016. Последний мажорный релиз — версия 4, так как версию 3 пропустили. Angular используется Google, Wix, weather.com, healthcare.gov и Forbes(в соответствии с madewithangular, stackshare и libscore.com).


                      React характеризуется как “JavaScript-библиотека для создания пользовательских интерфейсов”. Впервые выпущенный в марте 2013-го, React разработан и поддерживается Facebook-ом, который использует React-компоненты на нескольких страницах(однако, не являясь одностраничным веб-приложением). В соответствии с этой статьей Криса Кордла, React в Facebook применяется значительно шире, чем Angular в Google. React также используют в Airbnb, Uber, Netflix, Twitter, Pinterest, Reddit, Udemy, Wix, Paypal, Imgur, Feedly, Stripe, Tumblr, Walmart и других(в соотв. с Facebook, stackshare и libscore.com).


                      В данный момент Facebook работает над выпуском React Fiber. Это изменит React под капотом — в результате, рендеринг должен значительно ускориться — но обратная совместимость сохранится после изменений. В Facebook рассказывали об этих изменениях на их конференции для разработчиков в апреле 2017-го, также была опубликована неофициальная статья о новой архитектуре. Предположительно, React Fiber будет выпущен вместе с React 16.


                      Vue — один из самых быстроразвивающихся JS-фреймворков в 2016-м. Vue описывает себя как “Интуитивный, Быстрый и Интегрируемый MVVM для создания интерактивных интерфейсов”. Впервые он был выпущен в феврале 2014-го бывшим сотрудником Google Эваном Ю(кстати, Эван тогда написал интересный пост про маркетинговую деятельность и цифры в первую неделю после старта). Это был неплохой успех, особенно учитывая, что Vue привлекает столько внимания будучи театром одного актера, без поддержки крупной компании. На данный момент, у Эвана есть команда из дюжины основных разработчиков. В 2016 была выпущена вторая версия. Vue используют Alibaba, Baidu, Expedia, Nintendo, GitLab. Список более мелких проектов можно найти на madewithvuejs.com.


                      И Angular, и Vue доступны под лицензией MIT, в то время как React — под BSD3-license. Есть много обсуждений по поводу патентного файла. Джеймс Аид(бывший инженер Facebook) объясняет причины и историю, лежащую за этим файлом: Патент Facebook касается распространения их кода при сохранении возможности защитить себя от патентных исков. Файл патента обновлялся единожды и некоторые люди утверждают, что React можно использовать, если ваша компания не собирается подавать в суд на Facebook. Можете ознакомиться с обсуждением вокруг этого Github issue. Я не являюсь адвокатом, поэтому вы сами должны решить, создает ли лицензия React проблемы для вас или вашей компании. Есть еще много статей на эту тему: Дэннис Уолш пишет, почему вам не стоит бояться. Рауль Крипалани предостерегает от использования в стартапах, у него также есть обзор в формате “изложение мыслей”. Также существует недавнее оригинальное заявление от Facebook на эту тему: “Разъяснение лицензии React”.


                      1.2 Core development


                      Как было отмечено ранее, Angular и React поддерживаются и используются крупными компаниями. Facebook, Instagram и Whatsapp используют их на своих страницах. Google использует их во многих своих проектах: например, новый пользовательский интерфейс Adwords был реализован с помощью Angular и Dart. Опять же, Vue разрабатывается группой лиц, чья работа поддерживается через Patreon и другие средства спонсирования. Решайте сами, хорошо это или плохо. Маттиас Гёцке считает, что небольшая команда Vue — это плюс, потому что это ведет к более чистому коду / API, и меньшему оверинженерингу.


                      Посмотрим на статистику: на странице команды Angular перечислено 36 человек, у Vue — 16 человек, у React страницы команды нет. На GitHub-е у Angular больше 25 000 звезд и 463 контрибьютора, у React — больше 70 000 звезд и 1000 контрибьюторов, и у Vue почти 60 000 звезд и лишь 120 контрибьюторов. Можете также проверить страничку “Github Stars History for Angular, React and Vue”. Опять же, Vue, похоже, очень хорошо развивается. В соответствии с bestof.js, за последние три месяца Angular 2 получал в среднем 31 звезду в день, React — 74 звезды, Vue — 107 звезд.



                      A Github Stars History для Angular, React и Vue (Источник)


                      Апдейт: Спасибо Полу Хеншелю за то, что указал на npm trends. Они показывают количество скачиваний для данных npm-пакетов и даже полезнее, как чистый взгляд на звезды GitHub.



                      Количество скачиваний для заданных npm-пакетов в течение двух лет


                      1.3 Жизненный цикл на рынке


                      Angular, React и Vue сложно сравнить в Google Trends из-за их разнообразных имен и версий. Одним из способов получить приблизительные значения может быть поиск в категории “Internet & technologies”. Вот результат:



                      Ну, что ж. Vue до 2014 года не существовало — значит, тут что-то не так. La Vue по-французски — “вид”, “взгляд”, или “мнение”. Может быть, дело в этом. Сравнение “VueJS” с “Angular” или “React” несправедливо, так как у VueJS почти нет результатов, которые можно сравнить с остальными.


                      В таком случае, попробуем кое-что другое. Technology Radar от ThoughtWorks дает хорошее представление о том, как технологии эволюционируют в течение времени. Redux находится на стадии принятия(принятия в проектах!) и он был бесценен на ряде проектов ThoughtWorks. Vue.js на стадии испытаний(испытайте!). Его описывают, как легковесную и гибкую альтернативу Angular с более низкой кривой обучения. Angular 2 находится на стадии оценки — он успешно используется командами ThoughtWorks, но пока не имеет настоятельных рекомендаций.


                      В соответствии с последним опросом StackOverflow 2017, React любят 67% опрошенных разработчиков, а AngularJS — 52%. “Отсутствие интересу к продолжению разработки” регистрирует большие значения для AngularJS(48%) в сравнении с React(33%). Vue не входит в первую десятку ни в одном из случаев. Далее, есть опрос statejs.com, сравнивающий “front-end фреймворки”. Самые интересные факты: React и Angular обладают 100%-й известностью, Vue незнаком 23%-м опрошенных людей. Касательно “удовлетворенности”, React набрал 92% для варианта “использовал бы снова”, Vue — 89%, Angular 2 — только 65%.


                      Как насчет другого опроса об удовлетворенности пользователей? Эрик Элиотт запустил один в октябре 2016-го, чтобы оценить Angular 2 и React. Лишь 38% опрошенных людей использовали бы Angular 2 снова, в то время как 84% использовали бы снова React.


                      1.4 Долгосрочная поддержка и миграции


                      API React-а достаточно стабилен, как заявляет об этом Facebook в своих принципах проектирования. Существуют также скрипты, помогающие мигрировать с вашего текущего API на новый: попробуйте react-codemod. Миграции достаточно просты и здесь нет такой вещи(и необходимости в ней), как LTS версии. В этом посте на Reddit люди отмечают, что апгрейд на самом деле никогда не был проблемой. Команда React написала пост об их схеме версионирования. Когда они добавляют предупреждение об устаревании, они оставляют его для остальной части текущей релизной версии до того момента, пока поведение не будет изменено в следующей мажорной версии. Планов выпустить новую мажорную версию нет — v14 выпущена в октябре 2015-го, v15 опубликована в апреле 2016-го, а у v16 пока нет даты релиза. Обновление не должно стать проблемой, как недавно заметил один из основных разработчиков React.


                      Что касается Angular, есть пост о версионировании и релизах Angular начиная с релиза v2. Будет одно мажорное обновление каждые шесть месяцев и период устаревания(deprecation period), как минимум шесть месяцев(два мажорных релиза). Существуют экспериментальные API, помеченные в документации более коротким периодом устаревания. Официального анонса нет, но в соответствии с этой статьей, команда Angular анонсировала LTS версии начиная с Angular 4. Они будут поддерживаться как минимум год после следующего мажорного релиза. Это значит, что Angular 4 будет поддерживаться багфиксами и важными патчами как минимум до сентября 2018-го. В большинстве случаев, обновление со второй до четвертой версии Angular также просто, как обновление зависимостей Angular. Angular также предоставляет руководство с информацией о том, какие понадобятся изменения в дальнейшем.


                      Процесс обновления с Vue 1.x до 2.0 должен быть простым для небольшого приложения — команда разработчиков утверждает, что 90% API осталось без изменений. Имеется приятный инструмент для диагностики обновления и помощи во время миграции, работающий из консоли. Один из разработчиков отметил, что обновление с v1 до v2 до сих пор не приносит особого удовольствия на больших приложениях. К сожалению, roadmap-а для следующего мажорного релиза или информации о планах создания LTS версий нет.


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


                      1.5 Кадровые ресурсы и найм


                      Если у вас есть HTML-разработчики, которые не хотят углубляться в JavaScript, вам лучше выбрать Angular или Vue. React повлечет за собой увеличение количества JavaScript-а(позже мы поговорим об этом).


                      У вас есть дизайнеры, работающие в непосредственной близости с кодом? Пользователь “pier25” отмечает в своем Reddit-посте, что выбирать React имеет смысл, если вы работаете в Facebook, где каждый разработчик — супергерой. В реальном мире, вы не всегда найдете дизайнера, способного модифицировать JSX — по существу, работать с HTML-шаблонами будет намного проще.


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


                      Angular также хорош, если у вас есть разработчики с ООП-бэкграундом или те, кто не любят JavaScript. Чтобы заострить на этом внимание, цитата Манеша Чанда:


                      “Я не JavaScript-девелопер. Мой бэкграунд — создание крупномасштабных корпоративных систем с использованием “настоящих” платформ для разработки ПО. Я начинал в 1997-м, разрабатывая приложения на C, C++, Pascal, Ada и Fortran. (...) Я могу точно сказать, что JavaScript для меня просто белиберда. Будучи MVP в Microsoft и экспертом, я хорошо понимаю TypeScript. Я также не рассматриваю Facebook, как компанию-разработчика ПО. Однако, Google и Microsoft уже крупнейшие инноваторы в этой сфере. Я чувствую себя более комфортно, работая с продуктом, у которого есть хорошая поддержка от Google или Microsoft. Также (...) с моим бэкграундом, я знаю, что у Microsoft даже большие планы для TypeScript”

                      Ну… Видимо, я должен упомянуть, что Манеш Чанд является региональным директором в Microsoft.


                      Сравнение React, Angular и Vue


                      2.1 Компоненты


                      Все обсуждаемые фреймворки основаны на компонентах. Компонент получает что-то на вход и после внутренних вычислений возвращает отрендеренный шаблон UI(область входа / выхода с сайта или элемент списка to-do) на выходе. Определенные компоненты должно быть легко переиспользовать на веб-странице или в других компонентах. Например, у вас мог бы быть компонент сетки(состоящий из шапки и нескольких компонентов для рядов) с разнообразными свойствами(колонки, информация о шапке, data rows, и т.д.) и возможностью переиспользования этого компонента с разными данными на другой странице. Вот всеобъемлющая статья о компонентах на тот случай, если вам захочется изучить их получше.


                      И React, и Vue превосходно подходят для работы с “тупыми” компонентами: небольшие функции, не имеющие состояния, которые получают что-то на вход и возвращают элементы на выходе.


                      2.2 TypeScript vs ES6 vs. ES5


                      React фокусируется на использовании JavaScript ES6. Vue использует JavaScript ES5 либо ES6.


                      Angular зависит от TypeScript. Это дает большую консистентность в примерах и в опенсорсных проектах(примеры React можно найти в ES5 или в ES6). Это также вводит такие понятия, как декораторы или статическая типизация. Статическая типизация полезна для инструментов для анализа кода, типа автоматического рефакторинга, перехода к определению и т.д. — они должны уменьшить количество багов в приложении, хотя консенсус по поводу их использования, определенно, не достигнут. Эрик Элиот не согласен с этим в своей статье “Шокирующий секрет статических типов”. Дэниэл С Вонг говорит, что использование статических типов не вредит и что хорошо иметь разработку через тестирование(TDD) и статическую типизацию одновременно.


                      Вам, вероятно, следует знать о том, что вы можете использовать Flow, чтобы включить проверку типов в React. Это инструмент для статической проверки типов, разработанный Facebook для JavaScript. Flow также можно интегрировать в VueJS.


                      Если вы пишете код на TypeScript, вы уже не пишете стандартный JavaScript. Несмотря на рост, у TypeScript до сих пор крошечное число пользователей, по сравнению со всем языком JavaScript. Один из рисков может заключаться в том, что вы будете двигаться в неверном направлении, поскольку TypeScript может — хотя и вряд ли — исчезнуть со временем. Помимо того, TypeScript создает приличный оверхед на проектах(на обучение) — можете больше почитать об этом в Сравнении Angular 2 и React от Эрика Элиотта.


                      Апдейт: Джеймс Рейвенскрофт написал к этой статье комментарий о том, что у TypeScript первоклассная поддержка JSX — компоненты можно легко проверить на соответствие типу. Так что, если вам нравится TypeScript и вы хотите использовать React, это не должно быть проблемой.


                      2.3 Шаблоны — JSX или HTML


                      React нарушает устоявшиеся best practices. Десятилетиями разработчики пытались разделить шаблоны и встроенную джаваскриптовую логику, но в JSX они опять перемешаны. Может быть, это звучит ужасно, но вам следует послушать речь Питера Ханта “React: Переосмысление best practices”(от октября 2013-го). Он указывает на то, что разделение шаблонов и логики — это просто разделение технологий, а не ответственности. Вы должны создавать компоненты вместо шаблонов. Компоненты переиспользуемы, интегрируемы и удобны для unit-тестирования.


                      JSX — это опциональный препроцессор с HTML-подобным синтаксисом, который затем компилируется в JavaScript. Отсюда некоторые странности — например, вам нужно использовать className вместо class, потому что последний является в JavaScript зарезервированным ключевым словом. JSX — большое преимущество для разработки, так как у вас все будет в одном и том же месте, а также быстрее будут работать автокомплит и проверки на стадии компиляции. Когда вы допускаете ошибку в JSX, React не компилирует код и выводит номер строки, в которой допущена ошибка. Angular 2 тихо падает в рантайме(возможно, этот аргумент некорректен, если вы пользуетесь AOT с Angular).


                      JSX подразумевает, что все в React = JavaScript — он используется и для JSX-шаблонов, и для логики. Кори Хаус указывает в своей статье от января 2016-го: “Angular 2 продолжает внедрять ‘JS’ в HTML. React внедряет ‘HTML’ в JS”. Это хорошо, потому что JavaScript мощнее, чем HTML.


                      Шаблоны в Angular представляют собой усовершенствованный HTML со специальным языком Angular(штуки, вроде ngIf или ngFor). В то время, как React требует знания JavaScript, Angular заставляет вас учить специфичный для Angular синтаксис.


                      Vue предлагает “однофайловые компоненты”. Это похоже на компромисс относительно разделения ответственности — шаблоны, скрипты и стили в одном файле, но в трех различных, упорядоченных секциях. Это значит, что вы получаете подсветку синтаксиса, поддержку CSS и возможность легко использовать препроцессоры типа Jade или SCSS. Я прочитал в других статьях, что JSX проще дебажить, потому что Vue не показывает синтаксические ошибки в HTML. Это не так, поскольку Vue конвертирует HTML в render-функции — поэтому ошибки показываются без проблем(Спасибо Винициусу Рейзу за комментарий и поправки!).


                      Примечание: Если вам нравится задумка с JSX и вам хочется использовать его в Vue, вы можете использовать babel-plugin-transform-vue-jsx.


                      2.4 Фреймворки против библиотек


                      Angular — больше фреймворк, чем библиотека, так как предоставляет убедительные предложения о том, как ваше приложение должно быть структурировано, а также имеет больше функционала из коробки. Angular — это “цельное решение” — включены “батарейки” и вам предоставляется возможность удобного старта. Вам не нужно проводить анализ библиотек, решать вопрос с роутингом и т.п. — вы можете просто начать работать.


                      React и Vue, с другой стороны, универсально гибки. Их библиотеки можно совмещать с любого рода пакетами(их достаточно много для React в npm, но у Vue пакетов меньше, так как он еще достаточно молод). Используя React, вы можете даже заменить саму библиотеку на ее API-совместимую альтернативу, такую как Inferno. С большей гибкостью, однако, появляется большая ответственность — для React не существует правил и и ограничительных рекомендаций. Каждый проект требует принятия решения относительно его архитектуры, и все может легко пойти не так, как планировалось.


                      С другой стороны, Angular поставляется с запутанным клубком систем для сборки, бойлерплейтов, линтеров и других пожирателей времени, с которыми придется иметь дело. Это верно и для React в случае использования стартер-китов или бойлерплейтов. Конечно, они очень полезны, React работает из коробки, и это, может быть для вас способ его изучить. Иногда разнообразие инструментов, необходимых для работы в JavaScript-окружении называют “усталостью от JavaScript”. Вот статья Эрика Клеммонса, который сказал следующее:


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

                      Vue кажется самым чистым и легким из трех фреймворков. У GitLab есть пост о принятии решения в пользу Vue.js(октябрь 2016-го):


                      Vue.js прекрасно поставляется отлично сбалансированным в плане того, что он может сделать для вас и того, что вам нужно делать самостоятельно. (...) Vue.js всегда находится в пределах досягаемости; прочная, но гибкая сетка готова помочь сохранить эффективность вашего программирования и свести связанные с DOM страдания к минимуму.

                      Им нравится простота и легкость использования — исходный код очень читабелен и документация или внешние библиотеки не нужны. Все достаточно просто. Vue.js “не делает далекоидущих предположений о большей части чего-либо”. Имеется также подкаст о решении GitLab.


                      Другой пост о переходе на Vue от Pixeljets. React “был большим шагом вперед для мира JS в плане state-awareness, и он показал множеству людей реальное функциональное программирование хорошим, практичным способом”. Одним из серьезных минусов React по сравнению с Vue является проблема разбиения компонентов на более мелкие компоненты из-за ограничений JSX. Вот цитата из статьи:


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

                      На Hacker news и Reddit есть интересные дискуссии об этом посте — в наличии аргументы от недовольных и дальнейших сторонников Vue.


                      2.5 Управление состоянием и связывание данных


                      Разрабатывать UI сложно, так как состояния присутствуют везде — данные меняются с течением времени, что влечет за собой увеличение сложности. Определенные способы работы с состоянием оказывают большую помощь, когда приложение разрастается и становится более сложным. Для небольших приложений это может быть перебор, и что-то типа Vanilla JS было бы достаточно.


                      Как это работает? Компоненты описывают UI в определенный момент времени. Когда данные изменяются, фреймворк перерисовывает UI-компонент целиком — отображаемые данные всегда актуальны. Мы может назвать эту идею “UI как функция”.


                      React часто работает в паре с Redux. Redux описывает себя в трех фундаментальных принципах:


                      • Единственный источник правды
                      • Состояние доступно только для чтения
                      • Изменения делаются с помощью чистых функций

                      Другими словами: состояние приложения целиком находится в дереве объектов внутри единого хранилища. Это помогает отлаживать приложение и кое-какая функциональность становится проще для реализации. Состояние в read-only режиме и может быть изменено только через “экшены”, чтобы избежать состояния гонки(также полезно для отладки). “Редьюсеры” пишутся, чтобы указать, как “экшены” могут трансформировать состояние.


                      Большая часть туториалов и бойлерплейтов включают в себя Redux, но вы можете использовать React без него(или вам может быть вообще не нужен Redux в вашем проекте). Redux добавляет сложность и достаточно серьезные ограничения для вашего кода. Если вы изучаете React, вам стоит подумать об изучении чистого React перед тем, как вы перейдете к Redux. Вам определенно стоит прочесть “Вам может быть не нужен Redux” Дэна Абрамова.


                      Некоторые разработчики предлагают использовать Mobx вместо Redux. Можете думать о нем, как о “автоматическом Redux”, который упрощает использование и понимание с самого начала. Если хотите посмотреть, вам стоит начать с введения. Вы можете также почитать это полезное сравнение Redux и MobX от Робина. Тот же автор также предлагает информацию о переходе с Redux на MobX. Этот список полезен, если вы хотите проверить другие Flux-библиотеки. И, если вы пришли из мира MVC, вы захотите прочесть статью “Философия Redux (если вы уже знаете MVC)” Михаила Левковского.


                      Vue можно использовать с Redux, но он предлагает Vuex как свое собственное решение.


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


                      Оба подхода имеют плюсы и минусы. Вам нужно понять эти идеи и определить, влияют ли они на ваше решение о выборе фреймворка. И статья “Двустороннее связывание: Angular 2 и React”, и этот вопрос на StackOverflow предоставляют хорошие объяснения. Здесь вы можете найти интерактивные примеры кода(возрастом в 3 года, только для Angular 1 и React). Последнее, но тем не менее важное: Vue поддерживает и одностороннее, и двустороннее связывание(одностороннее по-умолчанию).


                      Если хотите почитать больше, имеется длинная статья о различных типах состояния и управлении состоянием в Angular-приложениях(от Виктора Савкина).


                      2.6 Другие концепции программирования


                      Angular включает в себя dependency injection, паттерн, в котором один объект(сервис) предоставляет зависимости другому объекту(клиенту). Это дает большую гибкость и более чистый код. Статья “Понять dependency injection” в деталях объясняет эту идею.


                      Паттерн Модель-Вид-Контроллер(MVC) делит проект на три части — модель, вид и контроллер. У Angular, как у MVC-фреймворка, имеется поддержка MVC из коробки. У React есть лишь V — что будет M и C нужно решить вам самим.


                      2.7 Гибкость и переход к микросервисам


                      Вы можете работать с React или Vue просто добавляя JavaScript-библиотеку к исходникам. Это невозможно с Angular, потому что он использует TypeScript.


                      Мы все больше движемся в сторону микросервисов и микроприложений. React и Vue предоставляют вам полный контроль над размером приложения, позволяя включить только те вещи, которые действительно нужны. Они дают больше гибкости при переходе от SPA к микросервисам, используя части бывшего приложения. Angular лучше подходит для SPA, так как для использования в микросервисах он, вероятно, слишком раздут.


                      Как отмечает Кори Хаус:


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

                      Некоторые люди также используют React для не-SPA вебсайтов(например, для сложных форм или мастеров). Даже Facebook использует React не для главной страницы, а, скорее, для определенных страниц и возможностей.


                      2.8 Размер и производительность


                      Обратная сторона функциональности: Angular довольно-таки раздут. Размер сжатого gzip-ом файла — 143кб, по сравнению с 23кб Vue и 43кб React.


                      И у React, и у Vue есть Virtual DOM, который должен увеличивать производительность. Если вам интересно, можете почитать об отличиях между Virtual DOM и DOM, а также о реальных преимуществах Virtual DOM в React. Один из авторов Virtual DOM также отвечает на вопросы, связанные с производительностью на StackOverflow.


                      Чтобы проверить производительность, я посмотрел великолепный js-framework-benchmark. Вы можете сами скачать и запустить его или посмотреть на интерактивную таблицу с результатами. Перед тем, как проверить результаты, вам нужно знать, что фреймворки обманывают бенчмарки — такие замеры производительности не должны быть основой принятия решений.



                      Производительность Angular, React и Vue (Источник)



                      Выделение памяти в Мб (Источник)


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


                      2.9 Тестирование


                      Facebook использует Jest, чтобы тестировать свой код на React. Здесь есть сравнение Jest и Mocha, и есть статья о том, как использовать Enzyme с Mocha. Enzyme — библиотека для тестирования, написанная на JavaScript, используемая Airbnb(в сочетании с Jest, Karma и другими тест-раннерами). Если вы хотите почитать побольше, имеются старые статьи про тестирование в React(здесь и здесь).


                      Далее, существует Jasmine, как тестовый фреймворк для Angular 2. В статье Эрика Элиотта говорится о том, что Jasmine “приводит к миллионам способов написания тестов и утверждений, нуждающихся в тщательном прочтении каждого из них, чтобы понять, что он делает”. Вывод также раздут и труден для чтения. Есть несколько информативных статей про интеграцию Angular 2 с Karma и Mocha. Также есть старое видео(от 2015-го) о тестовых стратегиях в Angular 2.


                      У Vue есть недостатки в тестировании, но Эван написал в своем превью от 2017-го, что команда планирует поработать над этим. Они рекомендуют использовать Karma. Vue работает с Jest, также есть тестовая утилита avoriaz.


                      2.10 Универсальные и нативные приложения


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


                      И React, и Angular поддерживают нативную разработку. У Angular есть NativeScript(при поддержке Telerik) для нативных приложений и Ionic Framework для гибридных приложений. С React вы можете попробовать react-native-renderer, чтобы разрабатывать кроссплатформенные приложения для iOS или Android, или react-native для нативных приложений. Большое число приложений(включая Facebook; за подробностями на Showcase) сделаны с помощью react-native.


                      JavaScript-фреймворки рендерят страницы на клиенте. Это плохо для воспринимаемой производительности, пользовательского опыта в целом и SEO. Серверный рендеринг — это плюс. У всех трет фреймворков имеются библиотеки, чтобы помочь с этим. Для React это next.js, у Vue есть nuxt.js, и у Angular есть… Angular Universal.


                      2.11 Кривая обучения


                      У Angular, определенно, крутая кривая обучения. Он обладает всеобъемлющей документацией, но иногда это может вас расстраивать, потому что ряд вещей сложнее, чем кажется. Даже если вы глубоко понимаете JavaScript, вам нужно изучить, что происходит под капотом фреймворка. Вначале установка магическая, предлагает большое число встроенных пакетов и кода. Это можно рассматривать, как минус из-за большой, сразу существующей экосистемы, которую вам нужно со временем изучить. С другой стороны, это может и хорошо в определенных ситуациях, поскольку многие решения уже приняты. С React вам, скорее всего, придется принять множество внушительных решений относительно использования third-party библиотек. Существует 16 различных flux-пакетов для управления состоянием, которые можно выбрать для React.


                      Vue довольно прост для изучения. Компании переходят на Vue из-за того, что он кажется значительно более простым для начинающих разработчиков. Тут вы сможете почитать, как некто описывает переезд своей команды с Angular на Vue. По информации от другого пользователя, приложение на React в его компании было таким сложным, что новый разработчик не идти в ногу с кодом. С Vue разрыв между младшим и старшим разработчиком сокращается, и они могут взаимодействовать проще и с меньшим количеством багов, проблем и времени на разработку.


                      Некоторые люди утверждают, что то, что они сделали на React было бы написано лучше с использованием Vue. Если вы — неопытный JavaScript разработчик — или в последние 10 лет работали в основном с jQuery — вам стоит подумать об использовании Vue. Сдвиг парадигмы более выражен при переходе на React. Vue выглядит больше как чистый JavaScript в тоже время привнося некоторые новые идеи: компоненты, событийная модель и однонаправленный data-flow. Также у него небольшой размер.


                      Тем временем, у Angular и React свой собственный подход к вещам. Они могут мешать вам, потому что вам нужно приспосабливаться под них, чтобы заставить их работать. Это может быть вредно из-за меньшей гибкости и крутой кривой обучения. Это также может быть и полезно, поскольку вас заставляют изучать правильные подходы в процессе изучения технологии. С Vue вы можете работать в стиле старомодного JavaScript. Это может быть проще вначале, но может стать проблемой в долгосрочной перспективе, если все сделать не верно.


                      Когда речь заходит об отладке, плюс React и Vue в меньшем количестве магии. Охота на баги проще, потому что есть лишь несколько мест, куда нужно смотреть, и у стектрейсов лучше видны отличия между собственным кодом и исходниками библиотеки. Работающие с React сообщают, что им никогда не требовалось читать исходный код библиотеки. Однако, отлаживая ваш код вашего приложения на Angular, вам часто нужно отлаживать внутренности Angular, чтобы понять лежащую в его основе модель. С другой стороны, сообщения об ошибках должны стать более чистыми и информативными начиная с Angular 4.


                      2.12 Под капотом Angular, React и Vue


                      Хотите проверить исходники самостоятельно? Хотите увидеть, как все складывается?


                      Возможно, вам стоит сначала проверить вот эти GitHub-репозитории: React(github.com/facebook/react), Angular(github.com/angular/angular) и Vue(github.com/vuejs/vue).


                      Как выглядит синтаксис? ValueCoders сравнивают синтаксис Angular, React и Vue.


                      Хорошо бы также увидеть все на продакшене — вместе с исходным кодом, на котором все основано. На TodoMVC есть список из десятков вариантов одного и того же Todo-приложения, написанного на различных JavaScript-фреймворках — можете сравнить решения на Angular, React и Vue. RealWorld разрабатывает реальное приложение(клон Medium) и у них есть готовые решения для Angular(4+) и React(с Redux). Для Vue работа в процессе.


                      Также есть некоторые реальные приложения, на которые вы можете посмотреть. Решения на базе React:



                      Приложения на Angular:



                      А также решения на Vue:



                      Заключение


                      Выберите фреймворк сейчас


                      И React, и Angular, и Vue достаточно круты, и никого из них нельзя поставить сильно выше остальных. Доверьтесь своему нутру. Эта последний кусочек развлекательного цинизма может помочь вам принять решение:


                      Грязный маленький секрет — “современная JavaScript-разработка” не имеет ничего общего с созданием веб-сайтов — это создание пакетов, которые могут использоваться людьми, создающими библиотеки, которые могут использоваться людьми, создающими фреймворки, которым люди, пишущие туториалы и ведущие курсы могут обучать. Не уверен, что кто-то действительно что-то создает для настоящих пользователей.

                      Это преувеличение, конечно, но в нем возможно есть доля правды. Да, в экосистеме JavaScript есть много лишнего шума. Может быть, вы найдете множество более привлекательных альтернатив во время ваших поисков — постарайтесь не быть ослепленным новейшим блестящим фреймворком.


                      Что я должен выбрать?


                      • Если вы работаете в Google: Angular
                      • Если вы любите TypeScript: Angular(или React)
                      • Если вам нужно руководство, структура и рука помощи: Angular
                      • Если вы работаете в Facebook: React
                      • Если вам нравится гибкость: React
                      • Если вы любите большие экосистемы: React
                      • Если вам нравится выбирать из десятков пакетов: React
                      • Если вы любиле JS и подход “все-есть-JavaScript”: React
                      • Если вам нравится действительно чистый код: Vue
                      • Если вы хотите простейшая кривую обучения: Vue
                      • Если вы хотите самый легковесный фреймворк: Vue
                      • Если вам хочется разделения ответственности в пределах одного файла: Vue
                      • Если вы работаете один или в небольшой команде: Vue(или React)
                      • Если ваше приложение имеет тенденцию разрастаться: Angular(или React)
                      • Если вы хотите иметь большой пул девелоперов: Angular или React
                      • Если вы работаете с дизайнерами и вам нужны чистые HTML-файлы: Angular или Vue
                      • Если вам нравится Vue, но пугает ограниченная экосистема: React
                      • Если вы не можете решить, изучите сначала React, затем Vue, затем Angular

                      Итак, вы приняли решение?



                      Дааа, вы его приняли!


                      Отлично! Читайте о том, как начать разрабатывать с Angular, React или Vue (скоро, подписывайтесь на меня в Twitter для обновлений).


                      Дополнительные ресурсы


                      React JS, Angular & Vue JS — Quickstart & Comparison (восьмичасовое введение и сравнение трех фреймворков)
                      Angular vs. React (vs. Vue) — the DEAL breaker (короткое, но превосходное сравнение от Доминика Т)
                      Angular 2 vs. React — the ultimate dance off (неплохое сравнение от Эрика Элиотта)
                      React vs. Angular vs. Ember vs. Vue.js (сравнение трех фреймворков в форме заметок от Гекана Сари)
                      React vs. Angular (понятное сравнение двух фреймворков)
                      Can Vue fight for the Throne with React? (приятное сравнение с большим количеством примеров кода)
                      10 reasons, why I moved from Angular to React (еще одно неплохое сравнение от Робина Вируча)
                      All JavaScript frameworks are terrible (большая заметка обо всех основных фреймворках от Мэтта Берджесса)

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

                      https://habrahabr.ru/post/338068/


                      Метки:  

                      Постъядерный караван в 35 килобайт

                      Понедельник, 18 Сентября 2017 г. 20:15 + в цитатник
                      Zoolander сегодня в 20:15 Разработка

                      Постъядерный караван в 35 килобайт

                        35 килобайт минифицированного кода на обычном JavaScript, семь городов, пустоши, радиоактивные гекконы, съедобные кактусы, встречные караваны и бандиты. Что это? Это небольшая игра, которая запускается в браузере. Ее принципы довольно просты для повторения и в самой примитивной версии ее можно воссоздать, наверное, на любом устройстве, если там есть устройство вывода и генератор случайных чисел. Но сегодня я хочу рассказать, как я реализовал ее для современных браузеров.

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

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



                        Возможности игры


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

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

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

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

                        Основная идея и логика программы


                        Базовая идея игры очень проста — мы запускаем бесконечный цикл, внутри которого выполняется четыре базовых операции:
                        1. Движение к заданной точке
                        2. Отсчет дней
                        3. Потребление еды
                        4. Проверка на вероятность для события, которое нас ждет в пустоши

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

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

                        Первая версия, с которой я начал экспериментировать, выглядела чистой иллюстрацией описанного алгоритма:



                        Я сделал этот прототип как ремейк игры про орегонский караван из этого туториала.

                        Одномерный прототип — караван для js13kGames


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



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

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

                        Список изменений
                        1. Многоразовое путешествие — игра не прекращается с достижением цели
                        2. Двухмерная карта мира и города
                        3. Другой сеттинг мира и никакой дизентерии
                        4. Бандиты могут вступать в переговоры и наниматься
                        5. Добавлены товары, которые автоматически продаются и покупаются при достижении города
                        6. Модульная система — логика на базе плагинов и наборы событий в отдельных файлах



                        Движок каравана и архитектура


                        Игра, как уже было сказано, сделана на чистом JavaScript без использования сторонних библиотек (вы можете сами добавить их, если сочтете нужным). Для отображения карты мира и интерфейса используется обычный HTML и CSS. Чтобы изменять их, используются базовые операции с DOM и классическая операция document.getElementById

                        Пример отображения количества игроков в караване
                        this.view = {}; // объект для хранения элементов DOM
                        this.view.crew = document.getElementById('game-stat-crew'); // находим элемент при запуске игры
                        // ...
                        this.view.crew.innerHTML = world.crew; //  записываем число людей в караване как обычный html 
                        



                        WorldState — модель мира


                        Мир в игре — это класс WorldState. Он хранит в себе все важные параметры и не содержит никакой логики. Логику мы привяжем потом, за счет плагинов.

                        function WorldState(stats) {
                            this.day = 0;           // текущий день, с десятичными долям
                            this.crew = stats.crew; // количество людей
                            this.oxen = stats.oxen; // количество быков
                            this.food = stats.food; // запасы еды
                            this.firepower = stats.firepower; // единиц оружия
                            this.cargo = stats.cargo;   // товаров для торговли
                            this.money = stats.money;   //деньги
                        
                            // лог событий, содержит день, описание и характеристику
                            //  { day: 1, message: "Хорошо покушали", goodness: Goodness.positive}
                            this.log = [];
                        
                            // координаты каравана, пункта отправления и назначения
                            this.caravan = { x: 0, y: 0};
                            this.from = {x: 0, y: 0};
                            this.to = {x: 0, y: 0};
                        
                            this.distance = 0; // сколько всего пройдено
                        
                            this.gameover = false;  // gameover
                            this.stop = false;    // маркер для обозначения того, что караван стоит
                            this.uiLock = false; // маркер для блокировки интерфейса
                        }
                        


                        Game — создание мира и игровой цикл


                        Игровой цикл запускается и управляется объектом Game. Этот же объект создает мир. Обратите внимание на поле plugins — по умолчанию это пустой массив. Game ничего не знает о плагинах, кроме двух вещей — у них должна быть функция инициализации init(world) и функция обновления update.

                        Game = {
                            plugins: [],  // генераторы событий, 
                        };
                        
                        Game.init = function () {
                            // создаем мир по стартовому состоянию которое хранится в отдельном файле
                            // в объекте StartWorldState в директории data
                            this.world = new WorldState(StartWorldState);
                        
                            var i;
                            for (i = 0; i < this.plugins.length; i++) {
                                this.plugins[i].init(this.world);
                            }
                        };
                        
                        // добавление плагинов
                        Game.addPlugin = function (plugin) {
                            this.plugins.push(plugin);
                        };
                        
                        // игровой цикл
                        Game.update = function () {
                            if (this.world.gameover) return; // никаких действий
                            var i;
                            for (i = 0; i < this.plugins.length; i++) {
                                this.plugins[i].update();
                            }
                        };
                        
                        Game.resume = function () {
                            this.interval = setInterval(this.update.bind(this), GameConstants.STEP_IN_MS);
                        };
                        
                        Game.stop = function () {
                            clearInterval(this.interval);
                        };
                        
                        Game.restart = function () {
                            this.init();
                            this.resume();
                        };
                        


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

                        Ешь, живи, двигайся — CorePlugin


                        Самые базовые действия каравана — перемещение, отсчет времени и потребление пищи — реализованы в объекте CorePlugin:

                        исходный код CorePlugin
                        CorePlugin = {};
                        
                        CorePlugin.init = function (world) {
                            this.world = world; // запоминаем world
                            this.time = 0; // общее время с начала игры, в миллисекундах
                            this.dayDelta = GameConstants.STEP_IN_MS / GameConstants.DAY_IN_MS; // сколько дней в одном шаге игру
                            this.lastDay = -1;  // отслеживаем наступление нового дня
                            this.speedDelta = Caravan.FULL_SPEED - Caravan.SLOW_SPEED; // разница между полной и минимальной скоростью
                        };
                        
                        CorePlugin.update = function () {
                            if (this.world.stop) return; // если стоим - никаких изменений
                            this.time += GameConstants.STEP_IN_MS; // увеличение времени
                            this.world.day = Math.ceil(this.time / GameConstants.DAY_IN_MS); // текущий день, целый
                        
                            // Движение каравана в зависимости от того, сколько дней прошло
                            this.updateDistance(this.dayDelta, this.world);
                        
                            // события связанные с наступлением нового дня
                            if (this.lastDay < this.world.day) {
                                this.consumeFood(this.world);
                                this.lastDay = this.world.day;
                            }
                        };
                        
                        // еда выдается один раз в день
                        CorePlugin.consumeFood = function (world) {
                            world.food -= world.crew * Caravan.FOOD_PER_PERSON;
                            if (world.food < 0) {
                                world.food = 0;
                            }
                        };
                        
                        // обновить пройденный путь в зависимости от потраченного времени в днях
                        CorePlugin.updateDistance = function (dayDelta, world) {
                            var maxWeight = getCaravanMaxWeight(world);
                            var weight = getCaravanWeight(world);
                        
                            // при перевесе - Caravan.SLOW_SPEED
                            // при 0 весе - Caravan.FULL_SPEED
                            var speed = Caravan.SLOW_SPEED + (this.speedDelta) * Math.max(0, 1 - weight/maxWeight);
                        
                            // расстояние, которое может пройти караван при такой скорости
                            var distanceDelta = speed * dayDelta;
                        
                            // вычисляем расстояние до цели
                            var dx = world.to.x - world.caravan.x;
                            var dy = world.to.y - world.caravan.y;
                        
                            // если мы находимся около цели - останавливаемся
                            if(areNearPoints(world.caravan, world.to, Caravan.TOUCH_DISTANCE)){
                                world.stop = true;
                                return;
                            }
                        
                            // до цели еще далеко - рассчитываем угол перемещения
                            // и получаем смещение по координатам
                            var angle = Math.atan2(dy, dx);
                            world.caravan.x += Math.cos(angle) * distanceDelta;
                            world.caravan.y += Math.sin(angle) * distanceDelta;
                            world.distance += distanceDelta;
                        };
                        
                        // регистрируем плагин в игре
                        Game.addPlugin(CorePlugin);
                        



                        Тут все элементарно. Сначала при запуске игры у нас вызывается init, который позволит сохранить ссылку на модель мира. Затем в игровом цикле у нас будет вызываться update, который будет менять мир к лучшему, как любят говорить персонажи из сериала «Силиконовая долина». Шутка — меняться мир будет во все стороны.

                        Наш базовый плагин отсчитывает время в миллисекундах, переводит их в дни, а затем обновляет дистанцию и запасы еды. В принципе, объект плагина просто должен содержать функции init(world) и update(), а делать он может что угодно. Можно даже просто вызывать какую-нибудь другую игру на HTML5 или создавать диалоговое окно.

                        Чтобы подключить плагин, надо добавить его код между определением объекта Game и первым вызовом Game.restart(). Примерно так, как это сделано сейчас в index.html:

                        
                        
                        
                        
                        
                        
                        
                        


                        Итак, как сделать игру про караван


                        Если вы опытный программист — вы, безусловно, можете реализовать подобную игрушку на любом языке и графическом уровне, просто отталкиваясь от самой идеи «цикл, в котором происходит перемещение и рандомный выбор из массива событий». Думаю, прекрасно получится даже игра для bash, тем более, что недавние публикации показывают, что там есть весьма интересные графические возможности.

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

                        Существующие плагины можно отключать (убирая их исходный код из index.html или закомментировав строку с Game.addPlugin(SomePlugin) в конце их кода). Они ничего не знают друг о друге и просто меняют модель мира или интерфейс игры.

                        Ну и последний вариант, для писателей — просто открывать файлы в директории data и редактировать описания событий и константы. Хотя это те же JavaScript-исходники, они довольны просты для изменений. Особенно тексты. Чтобы доказать это, я вкратце расскажу, как устроены другие плагины в текущей версии.

                        Случайные события


                        Все примитивные случайные события лежат в файле data/RandomEvents.js в переменной RandomEvents в таком формате:

                        var RandomEvents = [
                            {
                                goodness: Goodness.negative,
                                stat: 'crew',
                                value: -4,
                                text: 'На караван напал смертокогть! Людей: -$1'
                            },
                            {
                                goodness: Goodness.negative,
                                stat: 'food',
                                value: -10,
                                text: 'Кротокрысы на привале сожрали часть еды. Пропало пищи: -$1'
                            },
                          {
                                goodness: Goodness.positive,
                                stat: 'money',
                                value: 15,
                                text: 'У дороги найден мертвый путешественник. На теле найдены монеты. Денег: +$1'
                            },
                            {
                                goodness: Goodness.positive,
                                stat: 'crew',
                                value: 2,
                                text: 'Вы встретили одиноких путников, которые с радостью хотят присоединиться к вам. Людей: +$1'
                            },
                        


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

                        Первое поле — goodness- означает позитивную, негативную и нейтральную окраску сообщения в логе. Второе поле — stat — содержит название параметра WorldState, который должен меняться. Value — это среднее значение для изменения этого параметра. Последнее поле — должно содержать любой произвольный текст, описывающий произошедшее. Вместо символом $1 в текст будет подставлено реальное изменение параметра, которое выпадет в игре.

                        Случайные события проверяются на выпадение в объекте RandomEventPlugin и радуют взгляд игрока в логе:



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

                        Как написать или отредактировать диалог


                        За диалоговую систему отвечает объект DialogWindow. Если вы заглянете в его исходный код, то увидите мутанта, который находит в HTML-коде нужный div-элемент и привязывает к нему общий обработчик кликов мышкой. Идея заключается в том, что когда мы просим этот объект показать нам новый диалог, мы передаем ему массив наших диалогов. И обработчик нажатия на конкретный выбор описывается в конкретном диалоге в таком формате:

                        var DeathDialogs = {
                            "start": {
                                icon: "images/pic_death.jpg", // ссылка на url картинки
                                title: "Погибший в пустоши", // заголовок диалога
                                desc: "",                                // статический текст диалога
                                desc_action: function (world, rule) { // функция для создания вычисляемого текста диалога
                                    var desc = " Причина смерти: "+rule.text+". Вы сумели пройти "+Math.floor(world.distance) + " миль и накопить "+Math.floor(world.money) + " денег";
                                    desc += "Может быть, следующим караванщикам повезет больше?"
                                    return desc;
                                },
                                choices:[  // массив выборов
                                    {
                                        text: 'Начать новую игру', // текст на кнопке
                                        action: function () { return "stop"; }  // функция, возвращающая тег следующего диалога
                                    }
                                ]
                            },
                        };
                        


                        В диалогах смерти только один вариант, описанный как поле «start». Но таких вариантов может быть бесконечно много. К примеру, в диалогах бандитов я реализовал 12 развилок. Как происходит переход между ними? Наш универсальный объект DialogWindow при вызове функции show сохраняет у себя список переданных диалогов и показывает тот, который определен в поле «start».

                        При отображении очередного диалога его массив choices отображается как набор кнопок, в атрибуты которых записывается номер выбора. А все функции action из choices записываются во внутренний массив dialogActions. При клике мышкой на кнопке выбора универсальный обработчик определяет номер функции в dialogActions и вызывает ее, попутно передавая два аргумента, которые мы решили использовать в этом диалоге. Таким образом, в диалогах с бандитами функция action в конкретном choice может принимать состояние мира (world) и описание текущих бандитов (bandits). А в диалогах к другим плагинам — другие параметры. Да можно и вообще без них, особенно, если смысл выбора — просто закончить диалог, как при геймувере.



                        Чтобы диалог закончился и игрок вернулся к карте мира, надо, чтобы функция action в объекте choice возвращала один из зарезервированных тегов «finish»,«exit»,«stop». Вообще смысл этой функции в том, чтобы возвращать имя следующей развилки. Но до этого заветного return-a можно и порой нужно вставить любую логику, любые вычисления, которые позволят выбрать следующую развилку — «run», «fight» или, быть может, даже «love».

                        Как вызвать диалог из плагина


                        В любой момент времени в update любого работающего плагина можно вызвать диалог следующим образом:

                            // ... где-то в недрах update у объекта-плагина
                            // останавливаем караван, аналог паузы
                            world.stop = true; 
                           // просим показать диалог с набором развилок из DeathDialogs
                           // в развилки будут передаваться аргументы world и rule
                            DialogWindow.show(DeathDialogs, world, rule, this);
                        


                        Также в плагине должна быть реализована функция onDialogClose — этот коллбэк будет вызываться после закрытия диалога. Пример из плагина, определяющего наступление смерти:
                        DeathCheck.onDialogClose = function () {
                            Game.restart();
                        };
                        


                        Краткое описание существующих плагинов


                        В текущей версии игры используются следующие плагины:

                        Map2DPlugin — перемещение каравана по карте. Поиск городов, которые задаются в index.html как обычные div с параметрами top и left. Здесь же определяется прибытие в город и происходит автоматическая торговля.

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

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

                        DropPlugin — плагин перегруза. В прототипе из туториала про орегонский караван игра сама автоматически сбрасывала вещи — сначала оружие, а потом еду. Это было не очень комфортно и вызывало недоумение — как так-то? Ведь с оружием можно добыть еду, а «жареным мясом нельзя убить врага» (с) один известный стрим по Fallout 4. Так что я решил сделать диалог, в котором ты просто выбираешь, от чего избавиться.

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

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

                        Небольшие советы по текущей игре и балансу


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

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

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

                        Ссылки и дистрибутивы


                        Я использовал графику с лицензией Creative Common 0 с ресурсов pixabay.org и opengameart.org, так что и графика, и код распространяется на этих условиях — свободное копирование и использование, без каких-либо обязательств.

                        Исходный код можно взять с GitHub или скачать zip-архивом отсюда. Первый вариант предпочтительнее, так как чаще обновляется.

                        Для тестирования даже на локальном компьютере достаточно открыть index.html в браузере — там не используются функции, которым обязательно требуется сервер.

                        Живой билд игры можно потестить здесь. Верстка рассчитана на обычные мониторы, не на мобильные экраны.
                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/336724/


                        Метки:  

                        [Из песочницы] Играем с квантовой монеткой

                        Понедельник, 18 Сентября 2017 г. 19:29 + в цитатник
                        FasT93 вчера в 19:29 Разное

                        Играем с квантовой монеткой

                        Привет, Хабр!

                        Свой первый пост я решил посвятить квантовой информатике и ее приложению к теории игр. Эта идея абсолютна не нова и своими корнями уходит в статью Жиля Брассарда 1999 года [1]. Квантовая механика сама по себе удивительная вещь, а возможность ее использования в играх вдвойне удивляет!


                        «Если квантовая механика вас не потрясла до глубины души, значит, вы ее еще не поняли.» (Нильс Бор)
                        В этом посте речь пойдет о самой примитивной игре — подбрасывании монетки. Хотя вернее будет сказать переворачивании монетки. Суть игры в следующем:

                        Описание игры


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

                        Классический вариант


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


                        Буквы «П» и «Н» соответствуют действиям игрока: перевернуть монетку и ничего не делать. В каждой ячейке таблицы указано имя победителя. Отсюда сразу видно, что вероятность выигрыша Алисы равна $inline$\frac{1}{2}$inline$. К каким бы стратегиям не прибегали игроки, вероятность выигрыша каждого из них остается постоянной. И все бы хорошо, но Алиса оказалась очень азартным игроком: ей хочется выигрывать чаще чем в половине случаев! И квантовая механика способна помочь ей в этом!

                        Для дальнейшего чтения желательно быть знакомым с основами квантовой механики и кубитологии. Товарищ devpony опубликовал пост в котором на качественном уровне все это объяснено. Так же можно почитать соответствующую литературу [2].

                        Квантовый вариант


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

                        Введем два состояния для случаев «монета орлом вверх» и «монета решкой вверх»:


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


                        который переводит состояние $inline$|орел\rangle$inline$ в $inline$|решка\rangle$inline$ и наоборот. А действие «ничего не делать» соответствует тождественному преобразованию


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

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

                        На наши «монетные» состояние он действует следующим образом:

                        Последние обозначения введены для удобства дальнейшего использования.

                        Боб же с некоторой вероятностью (неизвестной для Алисы) выполняет одно из действий: $inline$X$inline$ или $inline$I$inline$. К сожалению подобное преобразование нельзя описать унитарной матрицей. Но теория открытых квантовых систем говорит нам, что подобное преобразование можно описать с помощью так называемых операторов Крауса [3]. Для дальнейшего рассмотрения нам потребуется представить наше состояние в виде матрицы плотности. Это более общая форма представления квантовых состояний, которая имеет очень широкое применение (подробнее почитать можно здесь [4]). Однако сейчас нам достаточно самого простого определения: если есть исходное состояние $inline$|\psi\rangle$inline$, то соответствующая ему матрица плотности будет задаваться как $inline$\rho=|\psi\rangle\langle\psi|$inline$. Это матрица размерности два с единичным следом и действительными неотрицательными собственными значениями (можете попробовать доказать эти два факта). Унитарная эволюция в терминах матриц плотности задается следующим образом


                        Если же квантовое преобразование представлено операторами Крауса, то формула немного изменяется


                        где $inline$E_k$inline$ — операторы Крауса, удовлетворяющие условию разложения единицы

                        Легко видеть, что унитарная эволюция является частным случаем эволюции в терминах операторов Крауса (когда имеется всего одна компонента в сумме).

                        Возвращаемся к Бобу. Он с вероятностью $inline$p$inline$ переворачивает монетку, и соответственно, с вероятностью $inline$1-p$inline$ не изменяет ее состояние. Это действие описывается двумя операторами Крауса:


                        Взятие корня обусловлено необходимостью удовлетворить условию разложения единицы о котором шла речь выше.

                        Теперь у нас есть все необходимые инструменты для детального анализа этой игры. Давайте же наконец-то поиграем вместе с Алисой и Бобом!

                        • Ход 0) Монетка находится в ящике в состоянии $inline$|орел\rangle$inline$, соответствующая матрица плотности есть $inline$\rho_0=|орел\rangle\langleорел|$inline$.
                        • Ход 1) Первой ходит Алиса: она применяет преобразование Адмара
                        • Ход 2) Теперь очередь Боба, он с вероятностью $inline$p$inline$ переворачивает монетку

                          Отдельно рассмотрим действие гейта NOT на состояние суперпозиции: $inline$X|+\rangle=\frac{1}{\sqrt{2}}(X|орел\rangle+X|решка\rangle)=\frac{1}{\sqrt{2}}(|решка\rangle+|орел\rangle)=|+\rangle$inline$. Оказывается, оно его не изменяет, следовательно:

                          мы получили состояние, такое же, как после хода Алисы, то есть, ход Боба вообще ни на что не влияет! Именно этот факт позволяет Алисе выиграть в игре.
                        • Ход 3) Победный ход Алисы: применение оператора Адамара


                        По окончанию всех ходов монетка будет находиться в состоянии $inline$|орел\rangle$inline$ с вероятностью 1. Используя данный метод Алиса может побеждать во всех играх (до тех пор пока ей не встретится соперник, который также знает квантовую механику).

                        Литература


                        [1] G. Brassard, R. Cleve, A. Tapp «The cost of exactly simulating quantum entanglement with classical communication», 1999, arxiv.org/pdf/quant-ph/9901035.pdf.
                        [2] Дж. Прескилл «Квантовая информация и квантовые вычисления», 2008.
                        [3] Х.-П. Бройер, Ф. Петруччионе «Теория открытых квантовых систем», 2010.
                        [4] Нильсен М., Чанг И. «Квантовые вычисления и квантовая информация», 2006.
                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/338202/


                        Метки:  

                        GeekUniversity открывает набор на факультет разработки игр

                        Понедельник, 18 Сентября 2017 г. 18:59 + в цитатник
                        mary_arti сегодня в 18:59 Разработка

                        GeekUniversity открывает набор на факультет разработки игр



                          В нашем онлайн-университете для программистов открылся новый факультет разработки игр. За год обучения студенты научатся писать игры на C#, достигнув уровня middle.

                          GeekUniversity — совместный образовательный проект Mail.Ru Group и IT-портала GeekBrains. Программу обучения и спецкурсы для факультета разрабатывают Avito, Альфа-банк, МТС, Тинькофф, DeliveryClub.

                          Чтобы поступить на факультет разработки игр, необходимо сдать тест по теории языка C#. Тем, кто не справится с вступительным испытанием, предложат пройти подготовительные курсы — восемь занятий, за которые можно освоить объектно-ориентированное программирование и базовые конструкции C#. Программа факультета рассчитана на год, а интенсивность занятий составляет три-четыре раза в неделю. В ходе учебы студенты реализуют ряд проектов, которые смогут добавить в свое портфолио.

                          В рамках обучения студенты освоят C#, SQL, классические алгоритмы и структуры данных, пройдут курсы по дополненной реальности, архитектурам и шаблонам проектирования, а также изучат основы 3D-моделирования — это позволит им создавать простые модели и переносить их в Unity3D. В ходе курса учащиеся разработают свою первую игру на C# Unity3D – «Танки» (желающие смогут предложить и реализовать собственный игровой проект), создадут мобильный 3D-шутер, спроектируют и реализуют многопользовательскую стратегию.

                          Оставить заявку и получить подробную консультацию можно здесь.
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/338200/


                          Метки:  

                          [Из песочницы] Что такое dinghy или как ускорить docker

                          Понедельник, 18 Сентября 2017 г. 18:39 + в цитатник
                          jesprider сегодня в 18:39 Разработка

                          Что такое dinghy или как ускорить docker



                          Однажды я заглянул на Хабр, чтобы посмотреть как разработчики используют динги (dinghy) и вообще ускоряют работу докера на маке. На моё удивление по запросу динги я нашёл ровно ноль статей. Было бы нечестно не упомянуть, что тот же запрос вывел 4 комментария. С другой стороны этот факт не изменил картины в целом.

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

                          • Производительность докера на osx
                          • Запуск нескольких контейнеров, которые работают на порте 80

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

                          Проблема 1: низкая производительность докера на маке


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

                          Docker toolbox



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

                          В моём случае тулбокс оказался достаточно медленным. Данный инструмент хорошо подходит для запуска «статических» контейнеров. Когда же нужно интенсивно разрабатывать приложение, необходимо создавать mounted volumes (уже давно пытаюсь найти русский эквивалент, есть идеи?) вашей рабочей директории, то есть директории с кодом вашего приложения. И вот тут начинаются проблемы. Выяснив, что тулбокс не использует ни NFS ни rsync, я стал искать другие решения.

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

                          Docker for mac




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

                          К сожалению, докер для мака оказался ещё медленней. Никакого очевидного (и неочевидного) способа как ускорить сие приложение я не нашёл.

                          Преимущества:
                          — ещё легче устанавливается и настраивается
                          Недостатки:
                          — ужасно медленный
                          — только одна виртуальная машина, настраиваемся самим приложением

                          docker-osx-dev


                          Хорошее решение для ускорения работы на локальных машинах при работе с тулбоксом. Docker-osx-dev использует rsync, что значительно ускоряет отправку изменений в контейнер. Недостатком данного решения можно назвать «раздутый» размер контейнера, поскольку сами файлы копируются в контейнер.

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

                          Преимущества:
                          — значительно ускоряет перенос файлов в контейнер
                          Недостатки:
                          — висящий процесс
                          — раздувает размер контейнера

                          Dinghy


                          Dinghy — это надстройка над докер машиной (docker-machine), которая включает в себя NFS и proxy (о котором мы поговорим чуть позже, cейчас нас интересует проблема производительности). А насколько мне известно, ничего быстрее NFS (в данном контексте) ещё не придумали.

                          Теперь, вместо создания и использования дефолтной или бут ту докер виртуальной машины, мы создаём динги машину. По умолчанию в ней уже будет включен NFS. Если вы не хотите использовать прокси, то можно его отключить в настройках динги, поставив соответствующий флаг в true:

                          cat ~/.dinghy/preferences.yml
                          :preferences:
                            :proxy_disabled: false
                            :fsevents_disabled: false
                            :create:
                              provider: virtualbox
                              disk: 30000
                          

                          Недостаток: поскольку вы явным образом импортируете переменные окружения (например export DOCKER_MACHINE_NAME=dinghy и пр.), то использование обычных докер машин параллельно с динги может принести много хлопот.

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

                          Проблема 2: приложения на 80 порту


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

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

                          169b86af85da        codekitchen/dinghy-http-proxy:2.5   "/app/docker-entry..."    4 hours ago         Up 4 hours          0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 19322/tcp, 0.0.0.0:19322->19322/udp   dinghy_http_proxy
                          

                          Этот контейнер слушает на 80 порту и принимает все запросы на себя. Внутри этого контейнера имеется nginx сервер, который автоматически создаёт виртуальные сервера исходя из вашего docker-compose файла. Всё, что вам нужно, указать hostname в этом файле. Далее, при обращении на данный хост, динги найдёт нужную запись и перенаправит на нужный контейнер. Профит.

                          Заключение


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

                          Если у вас возник интерес по техническим деталям, оставляйте комментарии, постараюсь на всё ответить.

                          Спасибо за внимание.
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/338198/


                          Метки:  

                          Результаты опроса «Каким бы вы хотели видеть Toster.ru?»

                          Понедельник, 18 Сентября 2017 г. 18:13 + в цитатник
                          toster сегодня в 18:13 Управление

                          Результаты опроса «Каким бы вы хотели видеть Toster.ru?»

                            Всем привет от команды Тостера! Работая над улучшением нашего сервиса, мы постоянно изучаем данные веб-аналитики, собираем обратную связь от пользователей через службу поддержки или через вопросы, которые задают по тегу «Toster.ru». А когда нам нужно принять более сложное решение или поглубже разобраться в поведении и предпочтениях пользователей, мы проводим опросы. Сегодня как раз хотим поделиться с вами результатами одного из опросов, который провели совсем недавно.

                            Мы спросили пользователей о некоторых принципиальных нововведениях, которые планируем ввести на сервисе, а также попросили сравнить Toster.ru и Stackoverflow.com по ряду параметров. В опросе приняли участие более 2.5 тысяч человек, из которых две трети являются разработчиками (причём 39% имеют уровень квалификации Senior или Lead, 38% — Middle, и 23% — Junior или Intern).



                            Новые возможности Тостера


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



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

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



                            С небольшим отрывом победил вариант разделения вопросов по сложностям от Intern до Senior. То есть в том же стиле, в каком принято сейчас делить самих разработчиков по их квалификации.

                            Результаты опроса убедили нас в том, что делить вопросы по сложности надо. Надеемся, уже в скором времени вы сможете увидеть воплощение этой идеи на «Тостере».



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



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

                            Так что о введении отрицательных отметок мы ещё хорошенько подумаем. Для начала посмотрим — вдруг введение разделения вопросов по вопросов избавить от желания минусовать?



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



                            Тут мнения разделились примерно поровну: треть готова к такой возможности, а треть отнеслась к такой идее негативно. Примерно также поделились голоса при ответе на вопрос о готовности самим за это платить.

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



                            Дальше мы поинтересовались, хотели бы пользователи увидеть на «Тостере» конкурсные вопросы с денежным призом, который получал бы тот, чей ответ был первым признан решением?



                            Тут пользователи оказались более единодушны: более половины встретили эту идею тепло, лишь каждому пятому эта затея не понравилась.



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



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



                            Интеграция «Тостера» с другими сервисами TM


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

                            • 67% опрошенных хотело бы иметь возможность получить полноценный аккаунт на Хабрахабре за свою активность на «Тостере»;
                            • 56% согласились с тем, что за должную активность на «Тостере» было бы неплохо получить возможность бесплатно пользоваться сервисом «Фрилансим»: размещать заказы или откликаться на них;
                            • 46% согласилось с тем, что клёво иметь возможность не просто помогать людям находить решения, но и, в качестве бонуса, бесплатно размещать вакансии на Моём круге!
                            • Против таких возможных бонусов высказалось не более 10%.

                            Мы не будем до конца открывать завесу тайны над будущим «Тостера», однако, хотим отметить, что ваше мнение нам очень помогло скорректировать вектор дальнейшего развития проекта.



                            Тостер и StackOverflow


                            Поскольку нас частенько сравнивают со Stackoverflow, мы решили не упускать возможности и поинтересовались у пользователей, в чём преимущества «Тостера» над Stackoverflow и наоборот, в чём преимущества Stackoverflow над «Тостером»?

                            Большинство (порядка 40%) считает, что задать вопрос или дать ответ одинаково просто (сложно) на обоих ресурсах. Мнение оставшихся разделилось так, что вдвое большее число ответивших считают, что проще задать вопрос или дать ответ на «Тостере». А вот аудиторию Stackoverflow считают более дружелюбной, нежели на «Тостере».

                            Вопрос о преимуществах «Тостера» и StackOverflow мы оставили открытым, дав возможность самостоятельной формулировки. Не будем приводить здесь все ответы, ведь их огромное множество (и спасибо вам за это!), но топ самых популярных ответов выглядит так:

                            Основные преимущества «Тостера»:

                            • Русский язык
                            • Более приятный интерфейс
                            • Возможность создавать дискуссионные вопросы
                            • Более широкая тематика
                            • Можно просматривать все вопросы
                            • Локализация (специфичный софт вроде 1С)
                            • Рассылка дайджеста (это нас удивило)
                            • Низкий порог входа

                            Основные преимущества SO:

                            • Более сложные вопросы

                            • Большая аудитория
                            • Больше готовых решений
                            • Отсутствие дискуссий
                            • Лучшая модерация
                            • Англоязычное коммьюнити

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

                            https://habrahabr.ru/post/338196/


                            Метки:  

                            Поиск сообщений в rss_rss_hh_new
                            Страницы: 1437 ... 1149 1148 [1147] 1146 1145 ..
                            .. 1 Календарь