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

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

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

 

 -Постоянные читатели

 -Статистика

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

Habrahabr








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

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

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

Автопилот своими рукам. Добавляем электронное управление steer-by-wire на обычный автомобиль

Среда, 20 Сентября 2017 г. 12:41 + в цитатник
waiwnf сегодня в 12:41 Разработка

Автопилот своими рукам. Добавляем электронное управление steer-by-wire на обычный автомобиль

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


    Электроника в сборе


    Задумаемся на секунду, что нужно для системы электронного управления? Сервопривод, который может поворачивать колёса, и контроллер, чтобы сервоприводом управлять. Внезапно, всё это в большинстве современных автомобилей уже есть, и называется "усилитель рулевого управления". Традиционные чисто механические (как правило, гидравлические) усилители стремительно исчезают с рынка, уступая место узлам с электронным блоком управления (ЭБУ). А значит, задача сразу упрощается: нам остается только "уговорить" имеющийся ЭБУ усилителя выдать нужные команды на сервопривод.


    Очень удобным для доработки оказался KIA Cee'd начиная с 2015 модельного года (скорее всего аналогично и его соплатформенники от KIA/Hyundai). Сошлись одновременно несколько факторов:


    • Усилитель руля полностью электрический, нет возни с гидравликой, стоит копейки (относительно) на разборках. Вся нужная проводка выведена наружу и легко доступна.
    • Усилитель интегрирован с рулевой колонкой, поэтому к нему есть легкий доступ на автомобиле и любая дополнительная электроника останется в салоне в тепличных условиях (в отличие от усилителей, интегрированных в рулевую рейку).
    • Очень важно — есть пример успешной доработки аналогичного KIA Soul. Американская PolySync разрабатывает апгрейд Soul до полностью drive-by-wire платформы для беспилотников, и на их гитхабе можно подсмотреть много полезного.

    Итак, получена в распоряжение рулевая колонка в сборе:


    Рулевая колонка KIA Cee'd JD


    Будем заставлять её крутиться. Для этого нужно создать у блока управления впечатление, что


    1. Он находится в автомобиле с работающим двигателем.
    2. Водитель прикладывает вращающее усилие к рулевому колесу.

    Пойдем по порядку.


    Симуляция автомобиля


    Нужно понять интерфейс между электронным блоком управления (ЭБУ) усилителя и остальным автомобилем. Нагуглив электрическую схему видим картинку:


    Интерфейс ЭУР KIA Cee'd


    Из схемы видно, что физически интерфейс очень прост:


    • Питание (12V постоянное) через разъем E29.
    • Сигнал включенного зажигания (12V) через разъем M46.
    • CAN-шина данных также через разъем M46.

    Внешний вид и распиновки разъемов находим на том же сайте.


    С питанием и зажиганием всё просто, берем 12V с обычного компьютерного блока питания. Но если просто подать питание и зажигание, усилитель полноценно не включится, и усиливать не будет. Дополнительно нужна информация от других блоков автомобиля: работает ли двигатель (чтобы не тратить энергию аккумулятора при выключенном), текущая скорость (чтобы делать руль "тяжелее" на скорости), наверняка что-то ещё.


    Обмен данными между электронными блоками в современных автомобилях организован по шинам CAN (Controller Area Network). Это широковещательная (у пакетов нет адресов назначения) локальная сеть на витой паре, где каждый блок может публиковать свои данные. У каждого типа данных свой идентификатор. Например, в нашем случае усилитель руля рассылает значения угла поворота руля с ID 0x2B0. Часто бывает несколько физически разделенных шин, чтобы второстепенные блоки типа контроллеров стеклоподъемников не мешались обмену между критически важными компонентами. В Cee'd используется две шины: C-CAN и B-CAN (схема здесь, в части "Информация о канале передачи данных"). На C-CAN "висят" почти все блоки с ней и будем работать.


    Выбор адаптера CAN-шины


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


    1. Адаптеры в сборе с алиэкспресса. Их не пробовал, по слухам довольно много брака и софт видимо только под Windows.
    2. Arduino шилды на MCP2515/MCP2551, в основном клоны дизайна от seeed в любом магазине ардуинной тематики. Но совмещать такой шилд надо не с Arduino (я так и не смог заставить связку работать на воспроизведение с нужной скоростью), а с Raspberry Pi. В приложении ниже подробная инструкция.
    3. USB адаптер CANHacker Baby, разработка Artemka86. Выгодно отличается от вариантов с алиэкспресса отличной поддержкой "из первых рук" от разработчика (проверено лично, Артём подходит к делу с душой). Также плюсом является поддержка стандартного протокола LAWICEL совместимого с широким набором софта.

    Софта разного тоже много (за обзором опять сюда). Самый простой вариант — Linux c can-utils из SocketCAN, за который спасибо инженерам Volkswagen. Большой плюс SocketCAN в стандартизации — любое USB устройство с поддержкой протокола LAWICEL (pdf) видится системой как обычный сетевой интерфейс. Таким образом избегаем привязки к вендор-специфическому софту конкретного устройства. У текущей версии CANHacker есть небольшая несовместимость со стоковыми can-utils по работе с USB, поэтому берём патченную версию отсюда. Raspberry Pi с CAN шилдом работает со стоковым пакетом can-utils из Raspbian OS без проблем.


    Подключение к шине, запись пакетов


    С подключением к индивидуальному узлу на стенде всё просто: соединяем контакт CAN-High адаптера с CAN-High автомобильного узла, CAN-Low — c CAN-Low. По стандарту между CAN-High и CAN-Low должно быть 2 замыкающих резистора по 120 Ом, на практике обычно всё работает на довольно широком интервале сопротивлений, у меня например одно на 110 Ом.


    На автомобиле замыкающий резистор не нужен (они там уже стоят, чтобы шина сама по себе работала). В зависимости от модели авто, возможно придется повозиться с физическим доступом к проводке шины. Самый удобный вариант — разъём OBD-II (on-board diagnostic), он обязателен на всех легковых автомобилях, выпущенных в Европе с начиная 2001-2004 года и находится не дальше 60 см от рулевого колеса. На Cee'd разъём слева под рулём, за пластмасовой крышкой блока предохранителей.


    Диагностический разъём OBD-II KIA Cee'd


    Распиновка OBD-II стандартизована и включает шину CAN (CANH на 6 контакте, CANL на 14). Нам повезло, корейцы пошли по пути наименьшего сопротивления и вывели C-CAN, на которой висят все важные узлы, прямо на диагностический разъём:


    Шлюзы? Не, не слышали.


    В результате на Cee'd можно прослушать весь внутренний трафик, ничего в авто не разбирая. Когда машина не твоя, а знакомые пустили повозиться — большой плюс. Но такая халява не везде. У Volkswagen например служебная CAN изолирована от OBD шлюзом, поэтому подключаться пришлось бы примерно так:


    Подключение к служебной CAN шине на Skoda Oсtavia через разъем блока управления КПП.


    Подключив все контакты, поднимаем сетевой интерфейс:


    $ sudo slcand -o -c -s6 -S 115200 ttyACM0 slcan0 && sleep 1 && sudo ifconfig slcan0 up

    Проверяем, что сеть работает и данные принимаются (включив зажигание):


    $ cansniffer slcan0

    И наконец, если всё нормально, можно записывать лог:


    $ candump -L slcan0 > real-car-can-log.txt

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


    Воспроизведение записи шины на стенде


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


    $ $ candump slcan0
      slcan0  2B0   [5]  00 00 00 00 00
      slcan0  2B0   [5]  FF 7F FF 06 F1
      slcan0  2B0   [5]  FF 7F FF 06 C2
      slcan0  2B0   [5]  FF 7F FF 06 D3
      slcan0  2B0   [5]  FF 7F FF 06 A4
      slcan0  2B0   [5]  FF 7F FF 06 B5
      slcan0  2B0   [5]  FF 7F FF 06 86
      slcan0  2B0   [5]  FF 7F FF 06 97
      slcan0  2B0   [5]  FF 7F FF 06 68
      slcan0  5E4   [3]  00 00 00
      slcan0  2B0   [5]  FF 7F FF 06 79
      slcan0  2B0   [5]  FF 7F FF 06 4A
    ....

    Видим, что рассылаются пакеты 2B0 (текущий угол поворота руля) и, реже, 5E4 (какой-то общий статус усилителя). Отфильтровываем их из общего лога:


    $ cat real-car-can-log.txt | grep -v ' 2B0' | grep -v ' 5E4 ' > can-log-no-steering.txt

    Фильтрованный лог можно подавать на воспроизведение:


    % sudo ifconfig slcan0 txqueuelen 1000
    $ canplayer -I can-log-no-steering.txt

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


    Эмуляция усилия на руле


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


    Провода к датчикам угла поворота руля и момента вращения на рулевом вале.


    Блок управления обрабатывает сигналы датчиков и выдаёт команды сервоприводу на создание дополнительного усилия на поворот рулевого вала.


    Проверка формата сигнала датчиков


    По информации PolySync, на Soul, у которого с Cee'd общая платформа, два аналоговых датчика крутящего момента. Cигнал каждого — отклонение уровня постоянного напряжения от базовых 2.5V, провода в жгуте — зеленый и синий. Проверим, что у нас то же самое:


    • Размыкаем разъем на ЭБУ, пробрасываем нужные контакты через макетку и заводим на аналоговые входы arduino.
      Кто сказал колхоз?!
    • Загружаем скетч, в цикле замеряющий напряжения и печатающий их в терминал.
    • Запускаем Serial Plotter в Arduino IDE, поворачиваем рулевой вал. Видим результат на графике, схема совпадает с Soul:
      График напряжения с датчиков момента силы на рулевом вале.
    • Радуемся сэкономленному времени.

    Эмуляция сигнала датчиков


    Переходим к эмуляции сигнала датчиков. Для этого поставим свой модуль в разрыв цепи между датиком и ЭБУ, будем транслировать настоящий сигнал с датчика и по команде сдвигать его на фиксированный уровень (изображая приложенное к рулевой колонке усилие). Силами одной arduino это не получится: там нет полноценного цифро-аналогового преобразователя, который мог бы выдавать постоянное напряжение. Аналоговые входы arduino нам тоже не очень подходят — хотя пинов для них целых 6, канал АЦП в контроллере только один, и его переключение между пинами занимает заметное время.


    Нужно добавить к arduino внешние ЦАП/АЦП. Мне попались модули YL-40 (описание в pdf) на основе чипа PCF8591 — на каждой по 4 канала 8-бит АЦП и 1 8-бит ЦАП. Модуль может общаться с arduino по протоколу I2C. Потребуется небольшое допиливание (в буквальном смысле): китайские товарищи поставили на плату светодиод индикации напряжения на выходе ЦАП — его обязательно надо отсоединить. Иначе утекающий через диод ток не даст ЦАП поднять напряжение на выходе больше 4.2V (вместо штатных 5V). Диод отсоединяем, отковыривая резистор R4 с обратной стороны платы.


    YL-40 отсоединяем диод от выхода ЦАП


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


    YL-40 убираем перемычки


    С интерфейсом к arduino есть нюанс — нам нужно 2 канала ЦАП, соотвественно 2 модуля, но у них одинаковые адреса I2C (зашиты в чип). Хотя чип позволяет менять свой I2C адрес, замыкая определенные ноги на +5V вместо земли, на плате эти перемычки не разведены. Вместо перепайки возьмем костыль — две разные библиотеки I2C на arduino (стандартная Wire и SoftI2CMaster), каждая на свою пару пинов. Получаем модули на разных шинах, конфликт пропадает.


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


    1. Включаем arduino, открываем Serial Monitor. Важно запустить arduino первой, не останавливать и не прерывать. Иначе напряжение на выходах ЦАПов сбросится, ЭБУ усилителя определит ошибку сигнала с датчиков, уйдет в безопасный редим и придется все перезапускать по новой.
    2. Запитываем усилитель, подключаем зажигание.
    3. Запускаем воспроизведение лога CAN-шины.
    4. Теперь по командам l и r через Serial Monitor усилитель будет поворачивать рулевой вал. Объявляется победа.




    На сегодня всё, на очереди доработка софта (интеграция с CAN шиной, чтение оттуда текущего угла поворота и динамическое управление крутящим усилием, чтобы внешний контроллер мог задать фиксированный угол поворота руля и система его выдерживала), отработка на автомобиле (на стенде не смоделируешь сопротивление от колёс). Возможно замена 8-битных ЦАП/АЦП на 10 или 12 бит (взял первое, что под руку попалось). Рулящая нейросеть тоже в процессе, надеюсь скоро сделать пост.


    Спасибо Artemka86 за ценные консультации по работе с CAN и помощь с оборудованием.


    Ресурсы для дальнейшего погружения


    1. Car Hacking: The definitive source. Начинать можно с Car Hacking for Poories, там отлично покрыты основы. Остальное тоже интересно, но с упором на несанкционированный доступ.
    2. The Car Hacker's Handbook: A Guide for the Penetration Tester. Больше деталей, чем в Car Hacking: The definitive source, тоже акцент на несанкционированный доступ. Если читать как первое введение в тему, надо приспособиться пропускать большие куски.
    3. Car Hacking 101: Tools of the Trade, MCD Software — обзоры инструментов. В основном малоинтересная экзотика на мой взгляд.
    4. Open Source Car Control — открытая платформа для KIA Soul, в процессе разработки. Они делают полное решение (руль, акселератор, тормоза), включвя доработки по "железу" на машине (в основном для тормозов — ставятся дополнительные тормозные приводы, что-то меняется в тормозной гидравлике итд). Релиза ещё не было, но многие вещи уже можно подсмотреть.


    Бонус. Совмещаем Raspberry Pi и Arduino CAN shield


    Прежде всего, внимание, CAN шилд и raspberry pi нельзя соединять напрямую, они не совместимы по напряжению. На Arduino UNO-совместимых платах напряжение логики 5V, а на raspberry pi только 3.3V, поэтому прямое соединение только сожжет задействованные пины.


    Нам понадобятся:


    • Raspberry Pi (проверялось на версии 3B).
    • Arduino CAN шилд на MCP2515/MCP2551.
    • Преобразователь уровня логики на 5 каналов или больше (можно 2 по 4 канала, но понадобится больше соединений). Мне попался этот

    Нужно завести на CAN шилд питание (5V), соединения интерфейса данных SPI (4 пина: MOSI, MISO, SCLK, CS) и 1 пин сигнала прерывания. Всё, кроме питания, идет через преобразователь уровня, который в свою очередь тоже надо запитать.


    На схемах ищем нужные пины.


    Raspberry Pi:


    Raspberry Pi pinout


    CAN шилд:


    Can shield pinout


    Получаем результат:


    • SPI на raspberry pi 19, 21, 23, 24 (MOSI, MISO, SCLK, CS) соответствуют D11, D12, D13, D9 (или на некоторых версиях D10) на CAN шилде.
    • Прерывание с D2 на шилде можно завести на любой GPIO пин raspberry, у меня это пин 22 (GPIO 25). Номер пина укажем в софте при настройке.

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


    Raspberry Pi + Arduino CAN shield


    Всё, кроме 5V питания и земли на шилд идёт через преобразователь:


    RPi - CAN shield converter connections labeled


    Переходим к настройке софта (стандартный Raspbian).


    1. Включаем поддержку SPI и CAN модуля. В /boot/config.txt добавляем


      dtparam=spi=on
      dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25,spimaxfrequency=1000000
      dtoverlay=spi0-hw-cs

      Здесь interrupt=25 указывает пин, на который заведено прерывание с шилда. Индексация идёт по GPIO пинам, поэтому interrupt=25 это GPIO 25, он же пин 22 по сквозной индексации всех пинов. Также важно указать частоту интерфейса SPI spimaxfrequency, т.к. значение по умолчанию — 10 МГц — слишком высокое для шилда, он просто не соединится.


    2. Перезагружаем raspberry pi, проверяем соединение с шилдом:


      $ dmesg
      ...
      [   12.985754] CAN device driver interface
      [   13.014774] mcp251x spi0.0 can0: MCP2515 successfully initialized.
      ...

    3. Устанавливаем can-utils:


      $ sudo apt install can-utils

    4. Запускаем виртуальный сетевой интерфейс:


      $ sudo /sbin/ip link set can0 up type can bitrate 500000
      $ sudo ifconfig can0 txqueuelen 1000

      Вторая команда важна при воспроизведении большого количества данных с raspberry pi, то есть когда записанный на автомобиле полный лог CAN шины воспоизводим для изолированного узла на стенде. Без увеличения буфера он скорее всего переполнится, когда в логе встретится несколько CAN пакетов с маленькими интервалами, и тогда соединение зависнет.


    5. Готово, можно пользоваться candump, cansniffer и всем остальным из can-utils.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338322/


    Метки:  

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

    Среда, 20 Сентября 2017 г. 12:32 + в цитатник
    pilot-retail сегодня в 12:32 Маркетинг

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


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

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

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

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

      Промо в чеке


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

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

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

      Итак, условно все промоакции подразделяются на две категории:

      • направленные на увеличение среднего чека (скидка на набор товаров, N+N, неразлучная пара, подарок за покупку);

      • направленные на удержание покупателей (купон на скидку, рекламный текст, содержащий календарь скидок).

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

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

      Акции, направленные на увеличение среднего чека


      Самыми распространенными и эффективными акциями, направленными на увеличение среднего чека, можно назвать:
      • акция N+N стимулирует покупателя приобретать товар впрок по сниженной цене. Например, 1+1 — два товара по цене одного — подразумевает 50% скидку на товар;



      • скидка на набор товаров — покупатель получает скидку/подарок при покупке определенного набора товаров. Например, если вы покупаете карандаш и ручку определенного производителя, то его ластик ритейлер готов отдать вам бесплатно. Или же, он подарит вам в подарок игрушку, если вы купили детской одежды на 2000 рублей;


      В нашем примере при приобретении набора товаров «три по цене двух» — двух лаков для ногтей — покупатель получает в подарок гребень для волос. В чеке он идёт по нулевой цене.

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


      В этом примере в качестве «неразлучной пары» выступают пудра и тушь — на пудру, как на товар с меньшей стоимостью, покупатель получает скидку 50%.

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


      В этом примере на чеке отображается сообщение для покупателя о получении подарка за покупку — мыло Safeguard на кассе. Сообщение о подарке дублируется на мониторе кассиру при переходе в расчётную часть чека.

      Фронт-офисной системе нужно проанализировать товарную часть чека, определить плавающую скидку и распределить её между товарами. А затем наглядно оформить в чеке, указав стоимость товара до, после применения скидки и общую скидку на чек.

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


      Акции, направленные на удержание покупателей


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

      Самыми распространенными и эффективными мероприятиями, направленными на удержание покупателей, можно назвать:
      • купонная акция;

      • рекламный текст, содержащий календарь скидок.

      Купонная акция состоит из двух обязательных этапов: печать купона и его применение (процентная или абсолютная скидка). Интервалы проведения акции могут быть различными: например, сегодня печатаем купон, а завтра применяем скидку. Либо всю неделю в будни печатаем купоны, а в выходные применяем их. Также ритейлер может указать зависимость купона (размера скидки) от суммы совершенной покупки. Например, в чеке на 500 рублей выводится купон на скидку в 5%, при 1000 рублей — на 10%. Уникальный купон формируется фронт-офисной системой динамически и содержит в себе информацию о номерах акции, магазина, кассы, кассовой смены и купона внутри чека. Применяется он единожды.

      На примере покупатель получает купон на 10% скидку от суммы покупки, действующий в период с 1 по 30 сентября.


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

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

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


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

      https://habrahabr.ru/post/338302/


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

      Среда, 20 Сентября 2017 г. 12:32 + в цитатник
      pilot-retail сегодня в 12:32 Маркетинг

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


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

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

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

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

        Промо в чеке


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

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

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

        Итак, условно все промоакции подразделяются на две категории:

        • направленные на увеличение среднего чека (скидка на набор товаров, N+N, неразлучная пара, подарок за покупку);

        • направленные на удержание покупателей (купон на скидку, рекламный текст, содержащий календарь скидок).

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

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

        Акции, направленные на увеличение среднего чека


        Самыми распространенными и эффективными акциями, направленными на увеличение среднего чека, можно назвать:
        • акция N+N стимулирует покупателя приобретать товар впрок по сниженной цене. Например, 1+1 — два товара по цене одного — подразумевает 50% скидку на товар;



        • скидка на набор товаров — покупатель получает скидку/подарок при покупке определенного набора товаров. Например, если вы покупаете карандаш и ручку определенного производителя, то его ластик ритейлер готов отдать вам бесплатно. Или же, он подарит вам в подарок игрушку, если вы купили детской одежды на 2000 рублей;


        В нашем примере при приобретении набора товаров «три по цене двух» — двух лаков для ногтей — покупатель получает в подарок гребень для волос. В чеке он идёт по нулевой цене.

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


        В этом примере в качестве «неразлучной пары» выступают пудра и тушь — на пудру, как на товар с меньшей стоимостью, покупатель получает скидку 50%.

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


        В этом примере на чеке отображается сообщение для покупателя о получении подарка за покупку — мыло Safeguard на кассе. Сообщение о подарке дублируется на мониторе кассиру при переходе в расчётную часть чека.

        Фронт-офисной системе нужно проанализировать товарную часть чека, определить плавающую скидку и распределить её между товарами. А затем наглядно оформить в чеке, указав стоимость товара до, после применения скидки и общую скидку на чек.

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


        Акции, направленные на удержание покупателей


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

        Самыми распространенными и эффективными мероприятиями, направленными на удержание покупателей, можно назвать:
        • купонная акция;

        • рекламный текст, содержащий календарь скидок.

        Купонная акция состоит из двух обязательных этапов: печать купона и его применение (процентная или абсолютная скидка). Интервалы проведения акции могут быть различными: например, сегодня печатаем купон, а завтра применяем скидку. Либо всю неделю в будни печатаем купоны, а в выходные применяем их. Также ритейлер может указать зависимость купона (размера скидки) от суммы совершенной покупки. Например, в чеке на 500 рублей выводится купон на скидку в 5%, при 1000 рублей — на 10%. Уникальный купон формируется фронт-офисной системой динамически и содержит в себе информацию о номерах акции, магазина, кассы, кассовой смены и купона внутри чека. Применяется он единожды.

        На примере покупатель получает купон на 10% скидку от суммы покупки, действующий в период с 1 по 30 сентября.


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

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

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


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

        https://habrahabr.ru/post/338302/


        Фьючерсы, индексы и IPO: как на самом деле устроены биржи и зачем они нужны

        Среда, 20 Сентября 2017 г. 12:17 + в цитатник
        itinvest сегодня в 12:17 Разное

        Фьючерсы, индексы и IPO: как на самом деле устроены биржи и зачем они нужны



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

          Как устроена биржа


          Биржа – это наиболее удобное место проведения операций с ценными бумагами. Она должна иметь в своем составе:

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

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

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

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

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

          Зачем это нужно


          Ценные бумаги являются одной из форм существования капитала и обращаются на фондовом рынке. Все это несет в себе целый ряд функций.

          Во-первых, ценные бумаги перераспределяют денежные средства:

          • Между странами и территориями.
          • Между отраслями промышленности и секторами экономики.
          • Между отдельными предприятиями внутри одного сектора.

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

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

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

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

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

          Пример: На протяжении 10 лет акции Berkshire Hathaway выросли с $6 000 до $10 000. В этой точке многие решили, что рост и так уже довольно значительный, и упустили возможность заработать огромные деньги на цене, которая в последующие 6 лет выросла до $70 000 и даже выше.

          image

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

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

          Производные инструменты: фьючерсы, опционы и не только


          Функционирование любой биржевой площадки сложно себе представить без так называемых производных инструментах или «вторичных ценных бумаг». Условно их можно разбить на следующие классы:

          • Депозитарные расписки;
          • Варранты на ценные бумаги;
          • Фьючерсные контракты;
          • Форвардные контракты;
          • Опционные контракты.

          Депозитарные расписки


          По своей сути наиболее близки к обычным акциям. Часто бывает, что какая-то иностранная компания (условный Ростелеком) хочет разместить в депозитарии Bank of New York свои акции и заключает с ним соответствующее соглашение. Банк под эти акции в дальнейшем выпускает в свободное обращение сертификаты ценных бумаг – американские депозитарные расписки (АДР). Одна АДР может соответствовать как одной, так и нескольким акций. АДР имеют номинал, выраженный в долларах США, и свободно обращаются на американских биржах. Что важно – курсовая стоимость АДР в пересчете на одну акцию и курс нацвалюты страны компании-эмитента акций, соответствует курсовой (рыночной) стоимости акций, лежащей в основе такой АДР.

          Варранты на ценные бумаги


          Термин «варрант »произошел от английского слова warranty – гарантия. Варрант – это право выкупить определенное количество акций предприятия в достаточно далеком будущем (от года до 5 лет).

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

          Фьючерсные контракты


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

          image

          График фьючерсного контракта из терминала SmartX

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

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

          Форвардные контракты


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

          1. Форвардные контракты заключаются только на внебиржевом рынке между двумя конкретными контрагентами – они же и несут риск неисполнения условий контракта (в случае фьючерсов этот риск лежит на бирже).
          2. Такой контракт может быть заключен на произвольную дату в будущем в отличие от фьючерса, который имеет стандартную дату исполнения.
          3. В качестве базового актива форвардного контракта может быть что угодно, а не только активы, допускающие биржевую стандартизацию.
          4. Такие контракты, как правило, не требуют гарантированных депозитов, и по ним не начисляется вариационная маржа.

          Опционы


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

          image

          Доска опционов терминала SmartX

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

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

          Что такое фондовые индексы и зачем они нужны


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

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

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

          Индексы могут быть «агентскими», когда их расчетом занимаются специальные агентства (пример — индексы S&P агентства Standard & Poor’s). Второй вариант — биржевые индексы, созданные, собственно, фондовыми площадками. В США это NASDAQ, а в России два основных биржевых индекса рассчитывались биржами ММВБ и РТС, которые теперь объединились в единую «Московскую биржу».

          Помимо этого, составителем индексов может быть и брокерская компания. Например, ITinvest рассчитывает собственные индексы, среди которых есть, к примеру, индексы корреляции (фьючерса на индекс РТС и индекса ММВБ, фьючерса на индекс РТС и индекса S&P 500), которые применяются для торговли фьючерсом на индекс РТС, «склеенные» фьючерсы и другие индикаторы.

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

          IPO: зачем это нужно, плюсы и минусы


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

          Когда компания хочет предложить свои акции широкой общественности, она проводит IPO(Initial Public Offering – IPO). Соответственно, статус организации меняется — вместо частной (акционером не может стать любой желающий) она становится публичной (акционером может стать любой желающий).

          У частных компаний могут быть акционеры, но их не так много, и такие компании сталкиваются с требованиями регулирующих органов, отличных от тех, которые предъявляются к публичным. Процесс подготовки первичного размещения акций IPO) занимает от нескольких месяцев до года и стоит компании довольно существенных средств.

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

          Еще один плюс наличия публично торгуемых акций компании — возможность предлагать топ-менеджерам опционы, переманивая лучших специалистов. Помимо этого, акции могут быть использованы в ходе сделок по слиянию и поглощению, покрывая часть оплаты — при покупке Facebook WhatsApp, основатели мессенджера получили значительную часть $19 млрд акциями социальной сети, которая уже вышла на биржу. Попадание в листинг крупнейших мировых бирж — NYSE или NASDAQ — это просто престижно.

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

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

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

          Заключение: полезные ссылки и материалы для изучения фондового рынка


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

          https://habrahabr.ru/post/338318/


          Метки:  

          Фьючерсы, индексы и IPO: как на самом деле устроены биржи и зачем они нужны

          Среда, 20 Сентября 2017 г. 12:17 + в цитатник
          itinvest сегодня в 12:17 Разное

          Фьючерсы, индексы и IPO: как на самом деле устроены биржи и зачем они нужны



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

            Как устроена биржа


            Биржа – это наиболее удобное место проведения операций с ценными бумагами. Она должна иметь в своем составе:

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

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

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

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

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

            Зачем это нужно


            Ценные бумаги являются одной из форм существования капитала и обращаются на фондовом рынке. Все это несет в себе целый ряд функций.

            Во-первых, ценные бумаги перераспределяют денежные средства:

            • Между странами и территориями.
            • Между отраслями промышленности и секторами экономики.
            • Между отдельными предприятиями внутри одного сектора.

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

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

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

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

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

            Пример: На протяжении 10 лет акции Berkshire Hathaway выросли с $6 000 до $10 000. В этой точке многие решили, что рост и так уже довольно значительный, и упустили возможность заработать огромные деньги на цене, которая в последующие 6 лет выросла до $70 000 и даже выше.

            image

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

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

            Производные инструменты: фьючерсы, опционы и не только


            Функционирование любой биржевой площадки сложно себе представить без так называемых производных инструментах или «вторичных ценных бумаг». Условно их можно разбить на следующие классы:

            • Депозитарные расписки;
            • Варранты на ценные бумаги;
            • Фьючерсные контракты;
            • Форвардные контракты;
            • Опционные контракты.

            Депозитарные расписки


            По своей сути наиболее близки к обычным акциям. Часто бывает, что какая-то иностранная компания (условный Ростелеком) хочет разместить в депозитарии Bank of New York свои акции и заключает с ним соответствующее соглашение. Банк под эти акции в дальнейшем выпускает в свободное обращение сертификаты ценных бумаг – американские депозитарные расписки (АДР). Одна АДР может соответствовать как одной, так и нескольким акций. АДР имеют номинал, выраженный в долларах США, и свободно обращаются на американских биржах. Что важно – курсовая стоимость АДР в пересчете на одну акцию и курс нацвалюты страны компании-эмитента акций, соответствует курсовой (рыночной) стоимости акций, лежащей в основе такой АДР.

            Варранты на ценные бумаги


            Термин «варрант »произошел от английского слова warranty – гарантия. Варрант – это право выкупить определенное количество акций предприятия в достаточно далеком будущем (от года до 5 лет).

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

            Фьючерсные контракты


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

            image

            График фьючерсного контракта из терминала SmartX

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

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

            Форвардные контракты


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

            1. Форвардные контракты заключаются только на внебиржевом рынке между двумя конкретными контрагентами – они же и несут риск неисполнения условий контракта (в случае фьючерсов этот риск лежит на бирже).
            2. Такой контракт может быть заключен на произвольную дату в будущем в отличие от фьючерса, который имеет стандартную дату исполнения.
            3. В качестве базового актива форвардного контракта может быть что угодно, а не только активы, допускающие биржевую стандартизацию.
            4. Такие контракты, как правило, не требуют гарантированных депозитов, и по ним не начисляется вариационная маржа.

            Опционы


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

            image

            Доска опционов терминала SmartX

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

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

            Что такое фондовые индексы и зачем они нужны


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

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

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

            Индексы могут быть «агентскими», когда их расчетом занимаются специальные агентства (пример — индексы S&P агентства Standard & Poor’s). Второй вариант — биржевые индексы, созданные, собственно, фондовыми площадками. В США это NASDAQ, а в России два основных биржевых индекса рассчитывались биржами ММВБ и РТС, которые теперь объединились в единую «Московскую биржу».

            Помимо этого, составителем индексов может быть и брокерская компания. Например, ITinvest рассчитывает собственные индексы, среди которых есть, к примеру, индексы корреляции (фьючерса на индекс РТС и индекса ММВБ, фьючерса на индекс РТС и индекса S&P 500), которые применяются для торговли фьючерсом на индекс РТС, «склеенные» фьючерсы и другие индикаторы.

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

            IPO: зачем это нужно, плюсы и минусы


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

            Когда компания хочет предложить свои акции широкой общественности, она проводит IPO(Initial Public Offering – IPO). Соответственно, статус организации меняется — вместо частной (акционером не может стать любой желающий) она становится публичной (акционером может стать любой желающий).

            У частных компаний могут быть акционеры, но их не так много, и такие компании сталкиваются с требованиями регулирующих органов, отличных от тех, которые предъявляются к публичным. Процесс подготовки первичного размещения акций IPO) занимает от нескольких месяцев до года и стоит компании довольно существенных средств.

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

            Еще один плюс наличия публично торгуемых акций компании — возможность предлагать топ-менеджерам опционы, переманивая лучших специалистов. Помимо этого, акции могут быть использованы в ходе сделок по слиянию и поглощению, покрывая часть оплаты — при покупке Facebook WhatsApp, основатели мессенджера получили значительную часть $19 млрд акциями социальной сети, которая уже вышла на биржу. Попадание в листинг крупнейших мировых бирж — NYSE или NASDAQ — это просто престижно.

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

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

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

            Заключение: полезные ссылки и материалы для изучения фондового рынка


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

            https://habrahabr.ru/post/338318/


            Метки:  

            Safari 11 и WebRTC: подводные камни видеозвонков

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

            Safari 11 и WebRTC: подводные камни видеозвонков

              Итак, это свершилось. Кроме iPhone 8, который устарел ровно через полчаса после анонса iPhone 10, Apple обновила свой десктопный и мобильный браузер Safari. Среди прочих улучшений — реализация WebRTC (ходят слухи, что частично позаимствованная у Chromium. «Plan B» на это тоже намекает). Что это значит для разработчиков? Можно звонить через браузер как на десктопе, так и на айфонах. Голосом и видео. Я уже писал про обновленные инструменты разработчика в браузере, а сейчас хочу поделиться, как это все работает в релизе. Мы уже обновили SDK Voximplant, проверили, как Safari звонит в Microsoft Edge, и вот что я хочу рассказать…

              Видео само не заиграет


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

              Как выглядит «явное разрешение от пользователя»? Это должен быть интерактивный элемент, в обработчике 'onclick' которого нужно вызвать метод 'play' для объекта видео. Вызов этого метода из другого места кода или программное нажатие на кнопку не включат воспроизведение видео. Помнится, много лет назад программисты Blizzard так же боролись с ботоводами в World of Warcraft, делая «protected» API, вызывать которые можно было только в ответ на действия пользователя.


              Safari поддерживает только h.264 видеокодек


              Когда два устройства договариваются об установке подключения, они обмениваются (с вашей помощью) текстовыми SDP пакетами. Где, кроме всего прочего, указаны поддерживаемые кодеки. h.264 поддерживают последние версии Chrome, Firefox и Edge — но в более старых версиях ее может не быть. Более того, кроме браузеров видеозвонки могут приходить и от других SIP-совместимых устройств: телефонов, программ-клиентов, мобильных приложений. И если там нет поддержки h.264 — то видеосвязи не будет.

              Мелочи, о которых стоит знать


              Chrome и Safari для описания медиапотоков в SDP-пакете использует «Plan B». А Firefox — «Unified Plan». Поэтому если больше одного медиапотока (например, при нескольких видеопотоках разного качества) — то кому-то придется выступать в роли переводчика. А про Edge я промолчу.

              Также Safari накладывает ряд ограничений на использование WebRTC: только HTTPS, iframe’ы только с того же домена, что и сайт. И если первое требование не вызывает никаких проблем, то требования к iframe’ам сильно ограничивает использование встраиваемых виджетов. С другой стороны, Apple тоже можно понять — именно с таких виджетов чаще всего идет навязчивая видеореклама.
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338312/


              Метки:  

              Safari 11 и WebRTC: подводные камни видеозвонков

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

              Safari 11 и WebRTC: подводные камни видеозвонков

                Итак, это свершилось. Кроме iPhone 8, который устарел ровно через полчаса после анонса iPhone 10, Apple обновила свой десктопный и мобильный браузер Safari. Среди прочих улучшений — реализация WebRTC (ходят слухи, что частично позаимствованная у Chromium. «Plan B» на это тоже намекает). Что это значит для разработчиков? Можно звонить через браузер как на десктопе, так и на айфонах. Голосом и видео. Я уже писал про обновленные инструменты разработчика в браузере, а сейчас хочу поделиться, как это все работает в релизе. Мы уже обновили SDK Voximplant, проверили, как Safari звонит в Microsoft Edge, и вот что я хочу рассказать…

                Видео само не заиграет


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

                Как выглядит «явное разрешение от пользователя»? Это должен быть интерактивный элемент, в обработчике 'onclick' которого нужно вызвать метод 'play' для объекта видео. Вызов этого метода из другого места кода или программное нажатие на кнопку не включат воспроизведение видео. Помнится, много лет назад программисты Blizzard так же боролись с ботоводами в World of Warcraft, делая «protected» API, вызывать которые можно было только в ответ на действия пользователя.


                Safari поддерживает только h.264 видеокодек


                Когда два устройства договариваются об установке подключения, они обмениваются (с вашей помощью) текстовыми SDP пакетами. Где, кроме всего прочего, указаны поддерживаемые кодеки. h.264 поддерживают последние версии Chrome, Firefox и Edge — но в более старых версиях ее может не быть. Более того, кроме браузеров видеозвонки могут приходить и от других SIP-совместимых устройств: телефонов, программ-клиентов, мобильных приложений. И если там нет поддержки h.264 — то видеосвязи не будет.

                Мелочи, о которых стоит знать


                Chrome и Safari для описания медиапотоков в SDP-пакете использует «Plan B». А Firefox — «Unified Plan». Поэтому если больше одного медиапотока (например, при нескольких видеопотоках разного качества) — то кому-то придется выступать в роли переводчика. А про Edge я промолчу.

                Также Safari накладывает ряд ограничений на использование WebRTC: только HTTPS, iframe’ы только с того же домена, что и сайт. И если первое требование не вызывает никаких проблем, то требования к iframe’ам сильно ограничивает использование встраиваемых виджетов. С другой стороны, Apple тоже можно понять — именно с таких виджетов чаще всего идет навязчивая видеореклама.
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/338312/


                Метки:  

                ФРИИ: опыт акселлерации компаний участников ISDEF

                Среда, 20 Сентября 2017 г. 12:02 + в цитатник
                Spbwriter сегодня в 12:02 Маркетинг

                ФРИИ: опыт акселлерации компаний участников ISDEF

                  Дмитрий Калаев, директор акселератора ФРИИ, уже три года выступает с докладами на ISDEF. В преддверии 16-ой осенней конференции ISDEF 2017 Дмитрий рассказал об опыте акселерации компаний, принадлежащих участникам Ассоциации iSpring, LeaderTask, FSPro Labs, Daminion, а также о том, насколько сложно ветерану рынка “перепахать” свою бизнес-модель.




                  Чем для тебя полезен ISDEF в плане набора проектов в акселератор?

                  Дмитрий Калаев: Во-первых, ISDEF — достаточно качественное комьюнити, в котором есть уже состоявшиеся предприниматели. Может быть, они пока не построили свои Google или Apple, но по крайней мере это люди с управленческим опытом, весомым опытом продаж, в том числе продаж за пределами России. Это очень хороший багаж, с которым можно растить большую компанию. И второе, ISDEF — это площадка, в которой больше технологических предпринимателей. То есть, не тех, кто научился хорошо продавать, работая, например, в Microsoft, или в другой уважаемой компании с хорошо выстроенными продажами. А наоборот, тех кто, вырос из технологии. У них в качестве базы уже есть достаточно сложный продукт, который сложно скопировать. Эти компании имеют конкурентов, но у них по крайней мере есть, что масштабировать.

                  Благодаря чему компании-участники ISDEF привлекли твое внимание?

                  Дмитрий Калаев: Например, iSpring — большая компания со сложной структурой изменений, которая делает топовый мировой продукт в e-learning, находясь в Йошкар-Оле. Это достаточно крупный бизнес, в которым мы, как акселератор, меняем курс корабля. Если у тебя корабль, в котором только пять гребцов, то тебе достаточно просто повернуть руль. Когда у тебя на корабле 140 гребцов, тебе надо перестроить ритм стука в барабаны, тогда разворот корабля занимает другое время. Но в целом iSpring — самый интересный проект, в том числе потому, что у него больше выручка.

                  Есть команда, которую мы пока ещё не смогли убедить в присоединении к работе на три месяца в Москве, но она нам очень интересна. Iridium Mobile вызывает уважение тем, что команда делает продукт мирового уровня для IoT, находясь в Нижнем Тагиле. Все это переворачивает мнение о России и регионах. В удаленном регионе, оказывается, существуют и техническая экспертиза, и предпринимательский опыт, и понимание международных рынков, позволяющее продавать не только в России, но и за рубежом, быть на лидирующих позициях.

                  А как выглядит состав портфеля акселератора с точки зрения региональной привязки?

                  Дмитрий Калаев: На сегодняшний день в нашем портфеле 50% проектов — это Москва, 50% — всё, что за пределами Москвы. Хотя чаще это всё-таки города-миллионники. Напротив, Нижний Тагил и Йошкар-Ола — это даже не миллионики, а более неожиданные города для возникновения мировых лидеров. А так основной поток нам делают города типа Новосибирска, Екатеринбурга, Краснодара и других. Хотя, если говорить не про ISDEF, то меня за последние пару лет удивил Архангельск, который привел сразу три компании. На самом деле, это большая отдельная тема о том, что в регионах есть компании, которые могут делать бизнес на весь российский рынок или даже на мировой.

                  Я бы ещё отметил коллег из московской компании Driver Pack Solutions. Компания делает продукт, решая проблему, которую такой гигант как Microsoft на протяжении десятилетий не может решить. Надо отдать должное Артуру Кузякову, который строит компанию не на стороне денег, а на стороне клиента. Их конкуренты достаточно жестко ведут себя по отношению к пользователям — не спрашивая, ставят много левого софта, который они не планировали ставить. Это позволяет им, с одной стороны, зарабатывать больше, но, с другой стороны, относятся к своим пользователям совершенно неэкологично. Естественно, что есть большой уровень недовольства, и вот Артур строит свой бизнес как раз по другой модели, когда в открытую объясняет какой софт, и зачем его ставят. Выручка меньше, чем у “злых” конкурентов, но на мой взгляд это совершенно правильный подход. Ты привносишь в мир какие-то улучшения и на этом зарабатываешь.

                  Какие сильные и слабые стороны у этих проектов ты можешь выделить?

                  Дмитрий Калаев: По факту одновременно сильная сторона является слабостью. Компании построены разработчиками. Я не вижу в этом ничего плохого, потому что сам был разработчиком, но последний раз код писал лет 13-14 назад. Суть в том, что это компании, которые отлично разбираются в том, что делать с продуктом, но есть пробелы экспертизы в продажах, маркетинге, в общении с клиентом, выяснении потребностей клиента, потому что мы как программисты идём, скорее, из нашего ощущения прекрасного. Но это как раз то, в чем мы как акселератор, сильны. Мы не учим, как лучше программировать, планировать итерации, распределять задачи внутри команды. Мы помогаем выяснить ценность для клиента, сегментировать клиентов на тех, кто помогает нам зарабатывать, и тех, кто наоборот разрушает нашу выручку и наш бренд. Я бы сказал, что это получается идеальная стыковка компетенции основателей и наших компетенций.

                  Расскажи, как проходила акселерация проектов?

                  Дмитрий Калаев: Шаг номер один это то, что мы называем диагностикой. Команда хочет увеличить выручку в два раза, увеличить прибыль или, начать выстраивать внутри команды зоны ответственности. Надо понять, где сейчас компания находится, кто клиент, кому продаем, какие компетенции есть, и каких компетенций не хватает. Второй шаг — это изменение видения мира у основателя. Он уже не стартапер, который делает первый бизнес, а предприниматель, бизнес которого существует уже 3, 5, 10 лет. Это значит, что у основателя уже выработались определённые привычки принимать решения, делегировать задачи, способ думать про клиента. По большому счёту на втором шаге привычки приходится пересмотреть. Очень важно, чтобы сам основатель был к этому готов. Потому что без готовности менять что-то никакого результата не получится. К счастью, разработчики — очень гибкие люди, которые в жизни поменяли, скорее всего, не по одному языку программирования. И пересмотреть свой взгляд на жизнь эти люди очень часто готовы. В отличии от более консервативных основателей, которые приходят к нам из традиционных отраслей, например, автомобильного или строительного бизнеса.

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

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

                  С какой мотивацией компании приходят в акселератор?

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

                  Какие проекты на данном этапе представляются наиболее интересными?

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

                  Например, один из лидеров нашего портфеля — компания Stafory (робот “Вера”). Она изменяют принцип рекрутмента в компаниях. Раньше рекрутёр шел на HeadHunter, набирал номера, звонил, приглашал на встречу, а теперь эту часть делает робот, который парсит сайты, квалифицирует клиента, приглашает на встречу. Задача довольно простая — голосовые интерфейсы IVR существуют уже десятки лет. Но в этом контексте ее ещё не применяли.

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

                  PS: До конца недели по промокоду ФРИИ33 можно зарегистрироваться на конференцию за 12000 рублей вместо 18000. Сама конференция пройдет 29 и 30 сентября, Дмитрий Калаев на ней — весь день 29.09, см. расписание #ISDEF2017.
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338284/


                  Метки:  

                  ФРИИ: опыт акселлерации компаний участников ISDEF

                  Среда, 20 Сентября 2017 г. 12:02 + в цитатник
                  Spbwriter сегодня в 12:02 Маркетинг

                  ФРИИ: опыт акселлерации компаний участников ISDEF

                    Дмитрий Калаев, директор акселератора ФРИИ, уже три года выступает с докладами на ISDEF. В преддверии 16-ой осенней конференции ISDEF 2017 Дмитрий рассказал об опыте акселерации компаний, принадлежащих участникам Ассоциации iSpring, LeaderTask, FSPro Labs, Daminion, а также о том, насколько сложно ветерану рынка “перепахать” свою бизнес-модель.




                    Чем для тебя полезен ISDEF в плане набора проектов в акселератор?

                    Дмитрий Калаев: Во-первых, ISDEF — достаточно качественное комьюнити, в котором есть уже состоявшиеся предприниматели. Может быть, они пока не построили свои Google или Apple, но по крайней мере это люди с управленческим опытом, весомым опытом продаж, в том числе продаж за пределами России. Это очень хороший багаж, с которым можно растить большую компанию. И второе, ISDEF — это площадка, в которой больше технологических предпринимателей. То есть, не тех, кто научился хорошо продавать, работая, например, в Microsoft, или в другой уважаемой компании с хорошо выстроенными продажами. А наоборот, тех кто, вырос из технологии. У них в качестве базы уже есть достаточно сложный продукт, который сложно скопировать. Эти компании имеют конкурентов, но у них по крайней мере есть, что масштабировать.

                    Благодаря чему компании-участники ISDEF привлекли твое внимание?

                    Дмитрий Калаев: Например, iSpring — большая компания со сложной структурой изменений, которая делает топовый мировой продукт в e-learning, находясь в Йошкар-Оле. Это достаточно крупный бизнес, в которым мы, как акселератор, меняем курс корабля. Если у тебя корабль, в котором только пять гребцов, то тебе достаточно просто повернуть руль. Когда у тебя на корабле 140 гребцов, тебе надо перестроить ритм стука в барабаны, тогда разворот корабля занимает другое время. Но в целом iSpring — самый интересный проект, в том числе потому, что у него больше выручка.

                    Есть команда, которую мы пока ещё не смогли убедить в присоединении к работе на три месяца в Москве, но она нам очень интересна. Iridium Mobile вызывает уважение тем, что команда делает продукт мирового уровня для IoT, находясь в Нижнем Тагиле. Все это переворачивает мнение о России и регионах. В удаленном регионе, оказывается, существуют и техническая экспертиза, и предпринимательский опыт, и понимание международных рынков, позволяющее продавать не только в России, но и за рубежом, быть на лидирующих позициях.

                    А как выглядит состав портфеля акселератора с точки зрения региональной привязки?

                    Дмитрий Калаев: На сегодняшний день в нашем портфеле 50% проектов — это Москва, 50% — всё, что за пределами Москвы. Хотя чаще это всё-таки города-миллионники. Напротив, Нижний Тагил и Йошкар-Ола — это даже не миллионики, а более неожиданные города для возникновения мировых лидеров. А так основной поток нам делают города типа Новосибирска, Екатеринбурга, Краснодара и других. Хотя, если говорить не про ISDEF, то меня за последние пару лет удивил Архангельск, который привел сразу три компании. На самом деле, это большая отдельная тема о том, что в регионах есть компании, которые могут делать бизнес на весь российский рынок или даже на мировой.

                    Я бы ещё отметил коллег из московской компании Driver Pack Solutions. Компания делает продукт, решая проблему, которую такой гигант как Microsoft на протяжении десятилетий не может решить. Надо отдать должное Артуру Кузякову, который строит компанию не на стороне денег, а на стороне клиента. Их конкуренты достаточно жестко ведут себя по отношению к пользователям — не спрашивая, ставят много левого софта, который они не планировали ставить. Это позволяет им, с одной стороны, зарабатывать больше, но, с другой стороны, относятся к своим пользователям совершенно неэкологично. Естественно, что есть большой уровень недовольства, и вот Артур строит свой бизнес как раз по другой модели, когда в открытую объясняет какой софт, и зачем его ставят. Выручка меньше, чем у “злых” конкурентов, но на мой взгляд это совершенно правильный подход. Ты привносишь в мир какие-то улучшения и на этом зарабатываешь.

                    Какие сильные и слабые стороны у этих проектов ты можешь выделить?

                    Дмитрий Калаев: По факту одновременно сильная сторона является слабостью. Компании построены разработчиками. Я не вижу в этом ничего плохого, потому что сам был разработчиком, но последний раз код писал лет 13-14 назад. Суть в том, что это компании, которые отлично разбираются в том, что делать с продуктом, но есть пробелы экспертизы в продажах, маркетинге, в общении с клиентом, выяснении потребностей клиента, потому что мы как программисты идём, скорее, из нашего ощущения прекрасного. Но это как раз то, в чем мы как акселератор, сильны. Мы не учим, как лучше программировать, планировать итерации, распределять задачи внутри команды. Мы помогаем выяснить ценность для клиента, сегментировать клиентов на тех, кто помогает нам зарабатывать, и тех, кто наоборот разрушает нашу выручку и наш бренд. Я бы сказал, что это получается идеальная стыковка компетенции основателей и наших компетенций.

                    Расскажи, как проходила акселерация проектов?

                    Дмитрий Калаев: Шаг номер один это то, что мы называем диагностикой. Команда хочет увеличить выручку в два раза, увеличить прибыль или, начать выстраивать внутри команды зоны ответственности. Надо понять, где сейчас компания находится, кто клиент, кому продаем, какие компетенции есть, и каких компетенций не хватает. Второй шаг — это изменение видения мира у основателя. Он уже не стартапер, который делает первый бизнес, а предприниматель, бизнес которого существует уже 3, 5, 10 лет. Это значит, что у основателя уже выработались определённые привычки принимать решения, делегировать задачи, способ думать про клиента. По большому счёту на втором шаге привычки приходится пересмотреть. Очень важно, чтобы сам основатель был к этому готов. Потому что без готовности менять что-то никакого результата не получится. К счастью, разработчики — очень гибкие люди, которые в жизни поменяли, скорее всего, не по одному языку программирования. И пересмотреть свой взгляд на жизнь эти люди очень часто готовы. В отличии от более консервативных основателей, которые приходят к нам из традиционных отраслей, например, автомобильного или строительного бизнеса.

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

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

                    С какой мотивацией компании приходят в акселератор?

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

                    Какие проекты на данном этапе представляются наиболее интересными?

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

                    Например, один из лидеров нашего портфеля — компания Stafory (робот “Вера”). Она изменяют принцип рекрутмента в компаниях. Раньше рекрутёр шел на HeadHunter, набирал номера, звонил, приглашал на встречу, а теперь эту часть делает робот, который парсит сайты, квалифицирует клиента, приглашает на встречу. Задача довольно простая — голосовые интерфейсы IVR существуют уже десятки лет. Но в этом контексте ее ещё не применяли.

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

                    PS: До конца недели по промокоду ФРИИ33 можно зарегистрироваться на конференцию за 12000 рублей вместо 18000. Сама конференция пройдет 29 и 30 сентября, Дмитрий Калаев на ней — весь день 29.09, см. расписание #ISDEF2017.
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338284/


                    Метки:  

                    Дизайн-система Acronis. Часть первая. Единая библиотека компонентов

                    Среда, 20 Сентября 2017 г. 10:34 + в цитатник
                    Nikishkin сегодня в 10:34 Дизайн

                    Дизайн-система Acronis. Часть первая. Единая библиотека компонентов



                      Меня зовут Сергей, я работаю старшим дизайнером в компании Acronis. В отделе дизайна продуктов для бизнеса я отвечаю за разработку и внедрение единой библиотеки компонентов.


                      Так как у нас много продуктов и сервисов, а дизайн в этих продуктах и сервисах сильно отличается, мы решили его унифицировать и привести к единому UI. Зачем? Все просто: такой подход дает возможность оптимизировать работу отдела, сосредоточить дизайнеров на UX, ускорить процесс разработки и запуск новых продуктов, снизить нагрузку на отделы тестирования и значительно сократить количество багов на стороне front-end. В этой статье я расскажу о нашем опыте, остановлюсь на инструментах и покажу, как устроена библиотека изнутри.


                      Здравствуйте. Я ваш куратор в игре «Актуальный UI-кит»


                      Долгое время роль библиотеки играл собранный в Иллюстраторе PDF файл с палитрой цветов, скудным набором элементов и большими планами на будущее в виде 70-ти пустых страниц. Для того, чтобы найти какой-нибудь уже существующий элемент, приходилось постоянно дергать других дизайнеров или лопатить чужие исходники, а потом сверять актуальность с реализованным элементом на одном из тестовых стендов. Пик отчаяния наступал в тот момент, когда на тестовом стенде искомый элемент выглядел несколько иначе и вел себя не совсем так, как было запланировано в макетах. Получалась достаточно стандартная ситуация: дизайнеры тянули одеяло в свою сторону, мотивируя свои решения авторитетным «Хочу, чтобы так!», а разработчики пытались прикрываться мало значимым «Но ведь технические ограничения?!». Такой подход, закономерно, приводил к не самым лучшим результатам по обе стороны баррикад и его нужно было менять. Забегая вперед, скажу, что сейчас большинство сложных UI решений мы принимаем коллегиально и стараемся искать компромисс между красотой и технологичностью. Итак:


                      Основные проблемы, которые требовали решения


                      • Централизованная библиотека UI элементов
                      • Версионность файлов и контроль за изменениями
                      • Единый и понятный workflow
                      • Базовый набор инструментов для работы
                      • Взаимодействие с разработчиками

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




                      Abstract отвечает за контроль версий и историю изменений мастер-файла библиотеки. Craft используется как библиотека для палитры цветов и замена нативному color инспектору. Lingo отвечает за хранение, подключение и обновление компонентов библиотеки в Sketch файлах.


                      Такая схема уже сейчас позволяет легко поддерживать библиотеку в актуальном состоянии, контролировать изменения и, что наиболее важно, быстро доставлять обновления дизайнерам. При этом, доступ к мастер-файлу библиотеки имеет только Owner, а остальные участники процесса получают элементы в виде символов и составных компонентов из Lingo. Для доступа к Angular компонентам мы подняли на каждой машине песочницу, чтобы дизайнеры с помощью «npm start» в консоли могли быстро запустить node server и работать с кодом.


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



                      Abstract


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




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




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


                      Craft


                      На данный момент мы используем Craft как библиотеку для цветовой палитры и замену нативному color инспектору. Под рукой не только все цвета, но и названия переменных. Благодаря такому подходу удалось решить еще одну важную проблему. Дизайнеры перестали “пипетить”, а разработчики перестали резонно негодовать, почему в двух макетах у одного и того же элемента отличаются значения цвета. Кто работает в Sketch и использует несколько мониторов знает, что на каждом подключенном мониторе один и тот же цвет взятый пипеткой, в большинстве случаев, будет иметь разный HEX.





                      Lingo


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




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




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




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


                      Плагины


                      Централизованно мы используем три плагина:


                      Первый — Shared Text Styles для работы с текстовыми стилями. Позволяет экспортить текстовые стили в JSON, добавлять стили в новый Sketch документ и апдейтить уже подгруженные.


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




                      Третий — Acronis data. Так как мы достаточно много работаем с таблицами и большими массивами данных, я собрал плагин, который генерирует специализированные значения для этих таблиц (offering items, agents name, schedule options, machines и т.д.). Плагин работает на основе dummy data и подтягивает значения из JSON. Перед тем, как собирать кастомное решение, была неудачная попытка подружить единый JSON с Craft, но увы. Как оказалось, Craft не умеет в исходную разметку документа и показывает поля не по порядку.






                      Иконки


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


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


                      Angular 4 компоненты


                      Неважно, насколько прокачана и удобна библиотека пока она существует исключительно в виде Sketch файла. Если в браузере компонент выглядит не так, как в макетах, библиотека уже неактуальна, а исходники устарели и не соответствуют действительности. Благодаря Сергею Сабурову, Кириллу Севёлову и всей команде мониторинга, наши компоненты плавно перетекают в код и работают именно так, как запланировано. Несмотря на то, что часть новых продуктов и сервисов мы уже начали собирать с помощью текущих компонентов, еще не все front-end команды готовы внедрять и использовать эти компоненты у себя. Где-то фронт написан на Ext JS, где-то используется Vue и быстрый переход с одного фреймворка или библиотеки на другой технически невозможен по ряду причин. О том, почему в компании выбрали именно Angular, подробно поговорим в следующей статье. А пока давайте вернемся к библиотеке и посмотрим, как устроены компоненты.


                      У каждого компонента есть набор свойств. Свойства позволяют управлять состоянием компонента, его внешним видом и функциональностью. Так выглядит стандартный инпут в Sketch библиотеке:




                      А вот так в коде:





                      Чтобы изменить размер и внешний вид инпута достаточно в свойствах указать


                      [size] = "'sm'"

                      Теперь давайте посмотрим на более сложный пример:




                      Два типа дропдаунов. В первом случае — это список из значений, во втором к списку значений добавляется строка поиска. Переключимся на код:




                      С помощью #selectChild получаем вложенный компонент для активного значения поля, через (select) подписываемся на событие текущего компонента, а с помощью директивы *ngFor проходим по массиву из значений и выводим их в выпадающем списке. Чтобы включить строку поиска и возможность искать по списку, во втором примере включаем свойство [search]. Как я говорил выше, более подробно об Angular и работе компонентов на front-end стороне мы расскажем в следующей статье. Stay tuned!


                      Дизайнеры и код


                      Одна из наших амбициозных и долгосрочных задач — перенести дизайн из Sketch в браузер, чтобы дизайнер мог передавать в разработку не статичные исходники или прототипы, собранные в сторонних приложениях, а готовый код. До того момента, как появились Angular компоненты, для сложных прототипов я продвигал Framer, каждую неделю готовил лекции, рассказывал о принципах и тонкостях работы с Coffee Script. Несмотря на потраченные усилия Framer не прижился по нескольким причинам:


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

                      От Framer мы полностью не отказались и изредка собираем в нем шоты для Dribbble. Забиваем гвозди микроскопом, да.





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


                      Заключение


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


                      Кстати, мы всегда рады опытным дизайнерам. Если вы такой, напишите мне на почту: sergey.nikishkin@acronis.com


                      Список ссылок


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

                      https://habrahabr.ru/post/338246/


                      Метки:  

                      [Перевод] Взбираясь на непокорённую гору: сложности создания игры в одиночку

                      Среда, 20 Сентября 2017 г. 09:00 + в цитатник
                      PatientZero сегодня в 09:00 Разработка

                      Взбираясь на непокорённую гору: сложности создания игры в одиночку

                      • Перевод
                      Standing at the foot of the mountain

                      Делать видеоигры сложно. Но ещё сложнее делать их в одиночку.

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

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

                      Прыгаем в одиночку


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

                      Jumping off a rock together
                      Держимся за руки, чтобы какой-нибудь умник не притворился, что прыгает, и не струсил в последний момент.

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

                      Одной из статей, помогших мне прыгнуть с обрыва, стала Fake Grimlock: Win Like Stupid.

                      Картинка из этой статьи хорошо описывает её в целом:

                      Venn diagram of how to win
                      Диаграмма Венна о том, как побеждать в жизни. Всю статью тоже стоит прочитать.

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

                      Когда я наконец принял решение уволиться с работы в Сан-Франциско и вернуться назад в Европу, чтобы выпустить собственную игру, мой изначальный план был довольно простым. Создать за 3-6 месяцев небольшую мобильную игру, сделать кучу ошибок, научиться на них и начать новый проект. Я думал, что во второй раз цикл будет быстрее и лучше, а у меня будет гораздо больше шансов на успех.

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

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

                      Паралич выбора


                      Too many choices
                      Чаще всего в процессе разработки я чувствовал себя, как Гомер

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

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

                      Это может сделать принятие решений невероятно сложным, и, возможно, самым важным из них будет КАКУЮ ИГРУ ВООБЩЕ ДЕЛАТЬ? Столкнувшись с бесконечными возможностями, вы можете оказаться парализованным.

                      Choice paralysis graph
                      Я решил, что в статью нужно добавить хотя бы один график, чтобы было похоже, что я знаю, о чём говорю

                      В первую очередь я постарался создать что-то вроде группы поддержки. Это был канал в Slack с небольшой группой друзей, работающих над своими инди-проектами или закончившими их. Мы писали вопросы/статьи/отзывы и раз в неделю чатились через Google hangout. Эта группа поддержки оказалась полезной в конкретизации концепции, чтобы мне не пришлось полностью доверять только своим инстинктам.

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

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

                      Prototype 1
                      Может выглядеть просто, но надо же с чего-то начинать!

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

                      Одиночество



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

                      Есть несколько аспектов, влияющих на то, насколько одиноко вы чувствуете себя, работая над проектом:

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

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

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

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

                      Co-working cafe
                      Я хожу сюда раз в неделю просто для того, чтобы перестать сходить с ума

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

                      Нехватка мотивации


                      Работа без коллектива очень сильно влияет на мотивацию. И когда вы работает в одиночку, никто не скажет вам, что пора перестать уже смотреть видео с котятами на ютубе. Иногда мне очень пригождался веб-сайт Toggl. Его порекомендовал мне Райан Дэрси, у которого есть потрясающий пост, объясняющий смысл Toggl и рассказывающий о многом другом: Making Moves.

                      Toggl
                      Toggl — лучший способ заставить себя работать больше часов.

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

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

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

                      People playing the game
                      Даже мой отец играл в Hang Line, а ведь ему уже 84!

                      Стоит заметить, что на том этапе игра выглядела вот так:


                      Раскачивайтесь, избегайте красных объектов, или умрёте. Это всё, что у меня было на тот момент.

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

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

                      На этом этапе моя мотивация была довольно сильной, но я начал сильно беспокоиться о деньгах…

                      Тревога


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

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

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

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

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

                      Prototype 3
                      По-прежнему не слишком впечатляет, но, по крайней мере, я заменил кубик!

                      Но примерно в этот момент у меня начали возникать действительно сложные задачи, на которые уходила куча времени. Есть древняя поговорка о том, что последние 20% работы занимают 80% времени. Проблема в том, что при создании прототипа и накидывании идей вам кажется, что игра движется очень быстро. Но когда вы переходите к таким задачам, как добавление релизной графики, доведение геймплейных систем до состояния релиза, то начинаете ощущать, что движетесь со скоростью улитки. Я начал сомневаться, что на самом деле смогу успеть доделать игру вовремя…

                      Неуверенность в себе


                      Если и есть одно слово, которое я никогда не хочу больше слышать, так это «индипокалипсис» (Indiepocalypse).

                      Mushroom Cloud
                      Очевидно, все мы обречены, и это очень полезно знать, когда надрываешься, чтобы завершить свою первую игру в одиночку

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

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

                      Нестабильность


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

                      Sad cat
                      Я слышал, что если добавить картинку с котиком, то аудитория читателей любой статьи увеличивается на 500%

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

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

                      Страх провала


                      Изначально я планировал потратить на игру 3-6 месяцев, но через 9 месяцев было очевидно, что предстоит ещё много работы. Проблема заключалась в том, что мои цели и ожидания сместились. Я уже вложил в игру больше денег, потому что работал над ней дольше, поэтому я перестал воспринимать её как первую попытку, на которой можно научиться. Она превратилась в то, что, как я надеялся и даже ждал, может принести мне немного денег. И если бы это не удалось, я бы расстроен намного сильнее.

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

                      Gambling
                      Трата части накоплений на создание видеоигры — это, в сущности, азартная игра

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

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

                      Hang Line iterative history
                      Совершите путешествие назад во времени развития вашей игры и осознайте, насколько это потрясающе

                      Заключение


                      Эта история ещё не закончена. Я работаю над моей игрой Hang Line уже около года, и она всё ещё не готова. Но недавно моя мотивация сильно выросла. Я наконец начал делать шаги по PR и делиться игрой в twitter, facebook и т.д. Я записал трейлер и получил большое внимание прессы, что очень повлияло на меня. Я ощутил, что игра — это что-то реальное, и что она нравится людям.

                      Поэтому моя последняя рекомендация — начните делиться своей работой с миром как можно раньше. Оценка вашей игры случайными людьми оказывает ОГРОМНУЮ помощь.

                      Не стоит думать об этом только с точки зрения PR. Общайтесь с другими разработчиками. В facebook есть отличные группы, например Indie Game Dev Group, в которых люди дают честную и полезную обратную связь. Не бойтесь и просто связываться с разработчиками, выпустившими похожие на вашу игры, просто чтобы попросить советов или рекомендаций. У меня от такого общения были только самые положительные ощущения. Люди, которые раньше не знали об игре, приходили мне на помощь, и это сильно повлияло и на саму игру, и на мотивацию.

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




                      А если хотите узнать, как заканчивается эта история, подпишитесь на рассылку на моём сайте: www.hanglinegame.com

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

                      Удачи!
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/337194/


                      Метки:  

                      Из эскулапов в сисадмины: есть ли жизнь в IT после Клятвы Гиппократа?

                      Среда, 20 Сентября 2017 г. 02:24 + в цитатник
                      Shaltay сегодня в 02:24 Разное

                      Из эскулапов в сисадмины: есть ли жизнь в IT после Клятвы Гиппократа?

                        На написание этого поста меня сподвигло прочтение другого поста моего, во всех смыслах, коллеги: "Из хирурга в разработчики: как в 40 лет сменить профессию?"

                        Дело в том, что наши с автором судьбы, в общем похожи. Я тоже окончил лечебный факультет СамГМУ — в 2001 году. Тоже работаю в IT-компании на руководящей позиции (только не разработчик, а линуксоид-системщик с уклоном в DevOps). Тоже получил второе высшее айтишное образование экстерном — не ради знаний, а исключительно ради того, чтобы иметь диплом. Разница в том, что я ушёл сразу после института, успел поработать в фармбизнесе, в продажах, и даже начальником IT в одной из больниц (а это самый жёсткий опыт, который только может быть в айтишной профессии — вот там реально помогало, что я врач). Теперь вот очередная ступень.

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


                        Через все отзывы к посту коллеги рефреном проходят две основные мысли. Первая — как это здорово, что Вы бросили нищенский оклад и занимаетесь тем, чем нравится! Вторая — в каком ужасном состоянии находится медицина в России, что врачи из неё бегут, а вот в Голландии/США/Чехии/страна мечты по вкусу такое невозможно, там у врачей достойный доход!

                        Обе эти мысли совершенно наивны. Сограждане, вообще, представление о людях в белых халатах строят на основании просмотренного сериала «Интерны». Врач для них — существо романтизированное и загадочное.

                        Проще, наверное, разъяснить людям их заблуждения в виде небольшого FAQ-a.

                        Кто уходит из медицины?


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

                        Куда уходят из медицины?


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

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

                        В айтишники из медицины уходят редко. Но и не настолько редко, чтобы прямо это был уникальный случай. Даже в США есть свой пример — взять вот компанию Bioware. Врачи сделали шедевральные Baldurs Gate и Planescape.

                        Почему врач-айтишник — редкость?


                        Медицинское образование, наверное, в наименьшей степени предрасполагает к тому, чтобы получивший это образование человек начал заниматься компьютерами. Процесс обучения — это тупая зубрёжка и практически полное отсутствие технических дисциплин. Медицина — вообще дело тёмное. Очень много всяких малоизученных до сих пор процессов, эффект плацебо, подавление мнения коллег авторитетом светил, куча экспериментальных методик из разряда «а давайте попробуем на крысах. Работает? Хорошо, ведите добровольцев»…

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

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

                        Почему так много плохих хирургов?


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

                        Для парней, разумеется, будет естественным выбрать специализацию хирурга. Мужская работа, престижная, денежная — в самом деле, не в терапевты и не в гинекологи же идти? Причём, всяких хирургий масса — есть общие хирурги, есть торакальные, есть урологи, есть нейрохирурги, есть ЛОРы — в общем, долго перечислять, просто поверьте, есть из чего выбрать.

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

                        Классический пример хирурга-неудачника — это Женя Лукашин из «Иронии судьбы», работающий хирургом в поликлинике. В поликлинике! Кого он там оперирует? Максимум, пишет неразборчивым почерком «Годен» в медицинской карте после вопроса «Жалобы к хирургу есть?»

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

                        Сколько на самом деле получает хирург?


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

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

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

                        В месяц набегает сумма, вполне сопоставимая с зарплатой тимлида.

                        Почему уход из медицины — не повод для гордости?


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

                        Это не история успеха. Стыдиться нечего, но и вдохновляться ей глупо.
                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/338280/


                        Метки:  

                        Go быстрее Rust, Mail.Ru Group сделала замеры

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

                        Go быстрее Rust, Mail.Ru Group сделала замеры

                          С такой фразой мне кинули ссылку на статью компании Mail.Ru Group от 2015 «Как выбрать язык программирования?». Если кратко, они сравнили производительность Go, Rust, Scala и Node.js. За первое место боролись Go и Rust, но Go победил.

                          Как написал автор статьи gobwas (здесь и далее орфография сохранена):
                          Эти тесты показывают, как ведут себя голые серверы, без «прочих нюансов» которые зависят от рук программистов.

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

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

                          Суть тестов


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

                          Итак, мы имеем два сценария. Первый — это просто приветствие по корневому URL:
                          GET / HTTP/1.1
                          Host: service.host
                          
                          HTTP/1.1 200 OK
                          
                          Hello World!

                          Второй — приветствие клиента по его имени, переданному в пути URL:
                          GET /greeting/user HTTP/1.1
                          Host: service.host
                          
                          HTTP/1.1 200 OK
                          
                          Hello, user

                          Первоначальный исходный код тестов


                          Node.js
                          var cluster = require('cluster');
                          var numCPUs = require('os').cpus().length;
                          var http = require("http");
                          var debug = require("debug")("lite");
                          var workers = [];
                          var server;
                          
                          cluster.on('fork', function(worker) {
                              workers.push(worker);
                          
                              worker.on('online', function() {
                                  debug("worker %d is online!", worker.process.pid);
                              });
                          
                              worker.on('exit', function(code, signal) {
                                  debug("worker %d died", worker.process.pid);
                              });
                          
                              worker.on('error', function(err) {
                                  debug("worker %d error: %s", worker.process.pid, err);
                              });
                          
                              worker.on('disconnect', function() {
                                  workers.splice(workers.indexOf(worker), 1);
                                  debug("worker %d disconnected", worker.process.pid);
                              });
                          });
                          
                          if (cluster.isMaster) {
                              debug("Starting pure node.js cluster");
                          
                              ['SIGINT', 'SIGTERM'].forEach(function(signal) {
                                  process.on(signal, function() {
                                      debug("master got signal %s", signal);
                                      process.exit(1);
                                  });
                              });
                          
                              for (var i = 0; i < numCPUs; i++) {
                                  cluster.fork();
                              }
                          } else {
                              server = http.createServer();
                          
                              server.on('listening', function() {
                                  debug("Listening %o", server._connectionKey);
                              });
                          
                              var greetingRe = new RegExp("^\/greeting\/([a-z]+)$", "i");
                              server.on('request', function(req, res) {
                                  var match;
                          
                                  switch (req.url) {
                                      case "/": {
                                          res.statusCode = 200;
                                          res.statusMessage = 'OK';
                                          res.write("Hello World!");
                                          break;
                                      }
                          
                                      default: {
                                          match = greetingRe.exec(req.url);
                                          res.statusCode = 200;
                                          res.statusMessage = 'OK';
                                          res.write("Hello, " + match[1]);    
                                      }
                                  }
                          
                                  res.end();
                              });
                          
                              server.listen(8080, "127.0.0.1");
                          }


                          Go
                          package main
                          
                          import (
                              "fmt"
                              "net/http"
                              "regexp"
                          )
                          
                          func main() {
                              reg := regexp.MustCompile("^/greeting/([a-z]+)$")
                              http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                                  switch r.URL.Path {
                                  case "/":
                                      fmt.Fprint(w, "Hello World!")
                                  default:
                                      fmt.Fprintf(w, "Hello, %s", reg.FindStringSubmatch(r.URL.Path)[1])
                                  }
                              }))
                          }


                          Rust
                          extern crate hyper;
                          extern crate regex;
                          
                          use std::io::Write;
                          use regex::{Regex, Captures};
                          
                          use hyper::Server;
                          use hyper::server::{Request, Response};
                          use hyper::net::Fresh;
                          use hyper::uri::RequestUri::{AbsolutePath};
                          
                          fn handler(req: Request, res: Response) {
                              let greeting_re = Regex::new(r"^/greeting/([a-z]+)$").unwrap();
                          
                              match req.uri {
                                  AbsolutePath(ref path) => match (&req.method, &path[..]) {
                                      (&hyper::Get, "/") => {
                                          hello(&req, res);
                                      },
                                      _ => {
                                          greet(&req, res, greeting_re.captures(path).unwrap());
                                      }
                                  },
                                  _ => {
                                      not_found(&req, res);
                                  }
                              };
                          }
                          
                          fn hello(_: &Request, res: Response) {
                              let mut r = res.start().unwrap();
                              r.write_all(b"Hello World!").unwrap();
                              r.end().unwrap();
                          }
                          
                          fn greet(_: &Request, res: Response, cap: Captures) {
                              let mut r = res.start().unwrap();
                              r.write_all(format!("Hello, {}", cap.at(1).unwrap()).as_bytes()).unwrap();
                              r.end().unwrap();
                          }
                          
                          fn not_found(_: &Request, mut res: Response) {
                              *res.status_mut() = hyper::NotFound;
                              let mut r = res.start().unwrap();
                              r.write_all(b"Not Found\n").unwrap();
                          }
                          
                          fn main() {
                              let _ = Server::http("127.0.0.1:8080").unwrap().handle(handler);
                          }


                          Scala
                          package lite
                          
                          import akka.actor.{ActorSystem, Props}
                          import akka.io.IO
                          import spray.can.Http
                          import akka.pattern.ask
                          import akka.util.Timeout
                          import scala.concurrent.duration._
                          import akka.actor.Actor
                          import spray.routing._
                          import spray.http._
                          import MediaTypes._
                          import org.json4s.JsonAST._
                          
                          object Boot extends App {
                            implicit val system = ActorSystem("on-spray-can")
                            val service = system.actorOf(Props[LiteActor], "demo-service")
                            implicit val timeout = Timeout(5.seconds)
                            IO(Http) ? Http.Bind(service, interface = "localhost", port = 8080)
                          }
                          
                          class LiteActor extends Actor with LiteService {
                            def actorRefFactory = context
                            def receive = runRoute(route)
                          }
                          
                          trait LiteService extends HttpService {
                            val route =
                              path("greeting" / Segment) { user =>
                                get {
                                  respondWithMediaType(`text/html`) {
                                    complete("Hello, " + user)
                                  }
                                }
                              } ~
                              path("") {
                                get {
                                  respondWithMediaType(`text/html`) {
                                    complete("Hello World!")
                                  }
                                }
                              }
                          }



                          Подлый удар в спину


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

                          Don't click
                          Дело в том, что в примере Node.js и Go компиляция регулярного выражения происходит единожды, тогда как в Rust компиляция выполняется на каждый запрос. Про Scala ничего сказать не могу.

                          Выдержка из документации к regex для Rust:

                          Example: Avoid compiling the same regex in a loop



                          It is an anti-pattern to compile the same regular expression in a loop since compilation is typically expensive. (It takes anywhere from a few microseconds to a few milliseconds depending on the size of the regex.) Not only is compilation itself expensive, but this also prevents optimizations that reuse allocations internally to the matching engines.

                          In Rust, it can sometimes be a pain to pass regular expressions around if they're used from inside a helper function. Instead, we recommend using the lazy_static crate to ensure that regular expressions are compiled exactly once.

                          For example:

                          #[macro_use] extern crate lazy_static;
                          extern crate regex;
                          
                          use regex::Regex;
                          
                          fn some_helper_function(text: &str) -> bool {
                              lazy_static! {
                                  static ref RE: Regex = Regex::new("...").unwrap();
                              }
                              RE.is_match(text)
                          }
                          
                          fn main() {}


                          Specifically, in this example, the regex will be compiled when it is used for the first time. On subsequent uses, it will reuse the previous compilation.


                          Выдержка из документации к regex для Go:

                          But you should avoid the repeated compilation of a regular expression in a loop for performance reasons.

                          Как допустили такую ошибку? Я не знаю… Для такого прямолинейного теста это является существенной просадкой в производительности, ведь даже в комментариях автор указал на тормознутость регулярок:
                          Спасибо! Я тоже думал было переписать на split во всех примерах, но потом показалось, что с regexp будет более жизненно. При оказии попробую прогнать wrk со split.

                          Упс.


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


                          Исправленный тест Rust
                          extern crate hyper;
                          extern crate regex;
                          
                          #[macro_use] extern crate lazy_static;
                          
                          use std::io::Write;
                          use regex::{Regex, Captures};
                          
                          use hyper::Server;
                          use hyper::server::{Request, Response};
                          use hyper::net::Fresh;
                          use hyper::uri::RequestUri::{AbsolutePath};
                          
                          fn handler(req: Request, res: Response) {
                              lazy_static! {
                                  static ref GREETING_RE: Regex = Regex::new(r"^/greeting/([a-z]+)$").unwrap();
                              }
                          
                              match req.uri {
                                  AbsolutePath(ref path) => match (&req.method, &path[..]) {
                                      (&hyper::Get, "/") => {
                                          hello(&req, res);
                                      },
                                      _ => {
                                          greet(&req, res, GREETING_RE.captures(path).unwrap());
                                      }
                                  },
                                  _ => {
                                      not_found(&req, res);
                                  }
                              };
                          }
                          
                          fn hello(_: &Request, res: Response) {
                              let mut r = res.start().unwrap();
                              r.write_all(b"Hello World!").unwrap();
                              r.end().unwrap();
                          }
                          
                          fn greet(_: &Request, res: Response, cap: Captures) {
                              let mut r = res.start().unwrap();
                              r.write_all(format!("Hello, {}", cap.at(1).unwrap()).as_bytes()).unwrap();
                              r.end().unwrap();
                          }
                          
                          fn not_found(_: &Request, mut res: Response) {
                              *res.status_mut() = hyper::NotFound;
                              let mut r = res.start().unwrap();
                              r.write_all(b"Not Found\n").unwrap();
                          }
                          
                          fn main() {
                              let _ = Server::http("127.0.0.1:3000").unwrap().handle(handler);
                          }
                          


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

                          Окружение


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

                          1. Ноут
                            • Intel® Core(TM) i7-6820HQ CPU @ 2.70GHz, 4+4
                            • CPU Cache L1: 128 KB, L2: 1 MB, L3: 8 MB
                            • 8+8 GB 2133MHz DDR3

                          2. Десктоп
                            • Intel® Core(TM) i3 CPU 560 @ 3.33GHz, 2+2
                            • CPU Cache L1: 64 KB, L2: 4 MB
                            • 4+4 GB 1333MHz DDR3

                          3. go 1.6.2, released 2016/04/20
                          4. rust 1.5.0, released 2015/12/10
                          5. Простите, любители Scala и Node.js, этот холивар не про вас.

                          Интрига


                          ab

                          Попробуем выполнить 50 000 запросов за 10 секунд, с 256 возможными параллельными запросами.

                          Десктоп


                          ab -n50000 -c256 -t10 "http://127.0.0.1:3000/
                          Label Time per request, ms Request, #/sec
                          Rust 11.729 21825.65
                          Go 13.992 18296.71

                          ab -n50000 -c256 -t10 "http://127.0.0.1:3000/greeting/hello"
                          Label Time per request, ms Request, #/sec
                          Rust 11.982 21365.36
                          Go 14.589 17547.04

                          Ноут


                          ab -n50000 -c256 -t10 "http://127.0.0.1:3000/"
                          Label Time per request, ms Request, #/sec
                          Rust 8.987 28485.53
                          Go 9.839 26020.16

                          ab -n50000 -c256 -t10 "http://127.0.0.1:3000/greeting/hello"
                          Label Time per request, ms Request, #/sec
                          Rust 9.148 27984.13
                          Go 9.689 26420.82

                          — Подожди, — скажет читатель. — И стоило тебе строчить статью ради каких-то 500rps?! Ведь это доказывает, что не важно на чем писать, все языки одинаковые!

                          И тут вступает в дело мой шнур. Шнур для зарядки ноутбука, разумеется.

                          Ноут на подзарядке


                          ab -n50000 -c256 -t10 "http://127.0.0.1:3000/"
                          Label Time per request, ms Request, #/sec
                          Rust 5.601 45708.98
                          Go 6.770 37815.62

                          ab -n50000 -c256 -t10 "http://127.0.0.1:3000/greeting/hello"
                          Label Time per request, ms Request, #/sec
                          Rust 5.736 44627.28
                          Go 6.451 39682.85

                          Стой, Go, ты куда?


                          Выводы


                          Я допускаю, что статья компании Mail.Ru Group содержала непреднамеренную ошибку. Тем не менее, за 1.5 года ее прочитали 45 тысяч раз, и её выводы могли сформировать предвзятое отношение в пользу Go при выборе инструментов, ведь Mail.Ru Group, несомненно, прогрессивная и технологичная компания, к чьим словам стоит прислушаться.

                          И всё это время Rust совершенствовался, посмотрите на «The Computer Language Benchmarks Game» Rust vs Go за 2015 и 2017 года. Отрыв в производительности только растет.

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

                          А если тебе нравится Rust, вливайся в сообщество, нам многого не хватает. Того же Tox.

                          Я надеюсь, что я был объективен и непредвзят, справедливость восторжествовала, а моя статья не содержит ошибок.

                          Let the Holy War begin!
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/338268/


                          Метки:  

                          [Перевод] Padding Oracle Attack: криптография по-прежнему пугает

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

                          Padding Oracle Attack: криптография по-прежнему пугает

                          • Перевод

                          Эту уязвимость чинят уже пятнадцать лет


                          В хабрапереводе текста четырёхгодовалой давности «Padding Oracle Attack или почему криптография пугает» была подробно описана атака на режим шифрования CBC. В этом режиме каждый очередной блок открытого текста xor-ится с предыдущим блоком шифротекста: в результате каждый блок шифротекста зависит от каждого блока открытого текста, который был обработан к тому моменту.



                          Чтобы пропустить исходное сообщение (произвольной длины) через CBC-шифр, к нему дописывается MAC (хеш для проверки целостности, обычно 20-байтный SHA-1) и затем padding, чтобы дополнить открытый текст до целого числа блоков (обычно 16-байтных):



                          Padding («набивка») состоит из одинаковых байтов, на единицу меньших своей длины: (0) или (1,1) или (2,2,2) или т.п.
                          Таким образом, получатель шифротекста должен
                          1. расшифровать все его блоки;
                          2. прочитать последний байт последнего блока, чтобы определить длину набивки и, соответственно, позицию MAC в открытом тексте;
                          3. проверить корректность набивки и MAC.

                          В 2002 г. французский криптограф Серж Воденэ обнаружил в CBC уязвимость к атакам типа «padding oracle»: если перехватить шифротекст (посредством MitM-атаки), изменять последний байт предпоследнего блока, отправлять изменённый шифротекст на сервер, и следить за его ответом — то по разнице между ответами «некорректная набивка» и «некорректный MAC» можно будет за 256 запросов определить последний байт исходного открытого текста. Тогда MitM начинает изменять предпоследний байт предпоследнего блока, и за 256 запросов определяет предпоследний байт открытого текста, и т.д. — по 256 запросов для расшифровки каждого байта.

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


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

                          Раз не должно быть разницы, набивка или MAC не прошли проверку — то может показаться, что содержимое набивки вообще незачем проверять: если открытый текст не завершается последовательностью из одинаковых байтов, то он заведомо некорректный, так что и MAC с подавляющей вероятностью не совпадёт. Но если злоумышленник подберёт такой размер шифротекста, чтобы последний блок целиком был занят набивкой, и на MitM-сервере будет заменять его на любой предыдущий блок из того же шифротекста — то сервер сообщит об ошибке только в том случае, если последний байт подставленного блока не расшифруется в (длину_блока–1). Получается такой же «padding oracle», только в профиль. Эта атака получила название POODLE. Современные реализации SSL/TLS обязательно проверяют содержимое набивки, и если оно некорректно — то считают набивку отсутствующей, и отправляют на проверку MAC весь результат CBC-расшифровки целиком. В принципе, клиентам это позволяет не пересылать лишний блок, целиком состоящий из набивки, когда открытый текст (вместе с MAC) изначально состоит из целого числа блоков, и при этом не оканчивается на последовательность одинаковых байтов.

                          После этих исправлений уязвимости «padding oracle» считались устранёнными, пока в 2013 г. пара британских исследователей не изобрели атаку «Lucky 13», в основе которой лежит тот факт, что время расчёта MAC зависит от длины хешируемой строки. Поскольку SHA-1 обрабатывает строку 64-байтными блоками, то злоумышленник может испробовать в качестве двух последних байтов предпоследнего CBC-блока все возможные двухбайтные комбинации, и скачок во времени отклика сервера будет означать переход между 55-байтной хешируемой строкой (один блок SHA-1; в конец хешируемой строки добавляется девятибайтный «трейлер») и 56-байтной (два блока), т.е. между двухбайтной набивкой и однобайтной:


                          Перехватив и изменив HTTPS-запрос 65536 раз, замеряя каждый раз время отклика сервера, в «стерильных» лабораторных условиях можно восстановить последние два байта открытого текста. На практике же на накопление достаточной статистики для восстановления двух байтов потребуется не одна сотня повторений этой серии из 65536 запросов. Таким образом, атака «Lucky 13» представляла скорее теоретическую опасность.

                          Своё название эта атака получила из-за того, что размер заголовка, хешируемого перед «полезной нагрузкой», ограничил перебор вариантов набивки двухбайтными последовательностями. Будь этот заголовок 14-байтным или длинее, скачок во времени отклика сервера пришёлся бы на более короткие куски открытого текста, и перебирать бы приходилось в сотни раз больше вариантов набивки. С другой стороны, будь этот заголовок 11-байтным, скачок бы пришёлся на переход между 8 и 9 блоками открытого текста, и атака была бы совершенно невозможна. Ну а самое счастливое число — конечно же, 12: с такой длиной заголовка для атаки было бы достаточно перебирать значения последнего байта самого по себе, как и в атаке Воденэ.

                          Для защиты от «Lucky 13» разработчики OpenSSL приложили недюжинную смекалку: по сути, во всём коде проверки MAC и набивки нельзя использовать ветвления — иначе время проверки для разных входных данных будет разным! Опуская подробности реализации SHA-1 без ветвления по числу обрабатываемых блоков, сосредоточимся на последнем шаге проверки: сравнение вычисленного значения MAC с фактически записанным в открытом тексте. Чтобы избежать ветвлений, код проверяет весь открытый текст байт за байтом, объединяя по AND разницу между ожидаемым и фактическим значением с «маской MAC» и с «маской набивки», и объединяя по OR результаты проверок всех байтов:

                          Изображённый 32-байтный открытый текст состоит из шестибайтного сообщения, 20 байтов MAC, и шести байтов набивки. Набивка не может быть длиннее 12 байтов (при пустом сообщении), но в любом случае код должен высчитать MAC и проверить все байты сообщения, прежде чем вернуть код ошибки.

                          Ну-ка, а что этот код будет делать, если последним байтом открытого текста будет «12» — заведомо невозможная длина набивки?

                          MAC будет вычисляться для сообщения длины -1!
                          Не важно, каким получится результат — он заведомо бессмысленный; важнее, что маска проверки MAC «сдвинулась» на один байт за начало сообщения — т.е. от получившегося мусорного значения проверяться будут только 19 байтов.
                          А что, если сдвинуть маску MAC целиком за начало сообщения?


                          Теперь на проверку MAC можно не обращать внимания: всё равно все байты разницы будут про-and-ены с нулевой маской! Единственная оставшаяся преграда — проверка содержимого набивки. Все её байты должны быть равны последнему, т.е. 31:


                          Таким образом злоумышленник может проверять, будет ли открытый текст целиком состоять из байтов со значением (длина_шифротекста–1): в этом случае OpenSSL сочтёт шифротекст корректным, и сервер вернёт ошибку более высокого уровня (например, ошибку HTTP).

                          Как использовать такой «оракул»? Теперь MitM-сервер должен действовать намного изощрённее, чем при атаке Воденэ. Предположим, скрипт злоумышленника отправил на HTTPS-сервер POST-запрос, оканчивающийся на 31 байт со значением 31. MitM-сервер перехватит шифротекст, возьмёт от него только два последних блока, а в качестве вектора инициализации возьмёт третий с конца блок шифротекста — и будет в нём при каждом запросе менять первый байт:


                          Из 256 попыток с разными значениями первого байта IV, 255 приведут к ошибке «некорректный MAC или набивка», и одна попытка приведёт к другой ошибке — так мы сможем восстановить 32-ой с конца байт POST-запроса!
                          Увеличим в POST-запросе длину пути на один байт, а тело запроса укоротим на байт — тогда нам будет известен 31-ый с конца байт запроса. Теперь изменим второй байт IV так, чтобы вторым байтом открытого текста опять получилось 31. Снова будем менять первый байт IV, и снова сможем восстановить 32-ой с конца байт запроса!
                          Сдвигая таким образом «просвечиваемый байт», MitM сможет расшифровать последние 16 байтов в POST-заголовке, и, если повезёт, HTTPS-куки окажутся среди этих 16 байтов. Скорость расшифровки получается та же самая, что и в оригинальной атаке Воденэ: до 256 запросов на каждый восстанавливаемый байт. Получается, что попутно с защитой от «Lucky 13» в OpenSSL внесли уязвимость, которая намного серьёзнее, чем сама «Lucky 13»!
                          Техническое замечание: даже если POST-запрос оканчивается на последовательность из байтов 31, перед CBC-шифрованием он будет дополнен MAC и набивкой, так что в описанном виде атака не сработает. Подготовительный этап атаки — варьируя запрашиваемый путь, подобрать такую длину POST-запроса, чтобы MAC и настоящая набивка заняли последние два CBC-блока целиком; затем в ходе атаки эти последние два блока будут отбрасываться, а использоваться будут блоки от пятого до третьего с конца. Наладив такую координацию действий между скриптом, генерирующим HTTPS-запросы, и MitM-сервером, злоумышленник может обеспечить, что результат CBC-расшифровки будет оканчиваться на 31 байт со значением 31.

                          Подводя итоги: на протяжении 15 лет с обнаружения первого «padding oracle», за каждой попыткой устранения таких «оракулов» следовало обнаружение (или даже нечаянное создание!) новых. Интересно, сколько времени пройдёт до обнаружениия следующего «padding oracle» в TLS с использованием CBC-шифров?
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/338072/


                          Глобальные тренды геймдева: о чем расскажут на «4C: Санкт-Петербург»?

                          Вторник, 19 Сентября 2017 г. 19:35 + в цитатник
                          Всего двадцать лет потребовалось игровой индустрии, чтобы из небольшой тусовки гиков превратиться в ключевой двигатель инноваций. Технологии и идеи, создававшиеся для игр, все сильнее проникают в другие сферы жизни. Графические процессоры теперь не просто обрабатывают графику, а занимаются серьезными вычислениями в медицине и других научных дисциплинах. Виртуальная реальность вовсю используется в автомобильном бизнесе, а дополненная — в промышленной и строительной сфере. Киберспорт станет частью Олимпийских игр. читать далее

                          https://habrahabr.ru/post/338252/


                          Метки:  

                          4 распространенные ошибки в дизайне, которые легко исправить

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

                          4 распространенные ошибки в дизайне, которые легко исправить

                            image

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

                            Confideal: чистим грязный цвет

                            image

                            Этот логотип прислали Логомашине в ВК.
                            image

                            Тут явная проблема с переходом цветов — градиентом. Между оттенками, которые стоят на разных концах цветового круга, всегда появляется «грязный» цвет. Такую же ошибку допустила Студия Лебедева в своем экспресс-дизайне за 100 000 рублей:

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

                            Кузнецкий техникум: улучшаем читаемость

                            image

                            Нам прислали такой логотип:
                            image
                            Люди редко рассматривают логотип вплотную. Гораздо чаще мы видим лого в движении, в маленьком формате или на расстоянии. Чтобы проверить, как логотип будет выглядеть в боевых условиях, немного размоем его — это называется «squint test».
                            image
                            Стало очевидно, что текст на красной плашке прочесть очень трудно. На это есть три причины.

                            Во-первых, он набран прописными. ВРОДЕ БЫ ВСЕМ ПОНЯТНО, ЧТО ЧИТАТЬ ТАКОЙ ТЕКСТ СЛОЖНО — НА ХАБРЕ ДАЖЕ ЕСТЬ ПРАВИЛО, КОТОРОЕ Я СЕЙЧАС НАРУШАЮ ВО ИМЯ НАГЛЯДНОСТИ. НО КОГДА ДЕЛО ДОХОДИТ ДО ЛОГОТИПОВ, ДАЖЕ ОЧЕНЬ ДЛИННЫЕ НАЗВАНИЯ НАБИРАЮТ ЗАГЛАВНЫМИ. Это делать можно, но осторожно.

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

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

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

                            Aircraft: убираем обводку

                            image

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

                            Разноторг: улучшаем композицию

                            image

                            Логотип сети универмагов:
                            image
                            Частая проблема в логотипах и дизайне в целом — плохая композиция. Ее сложно считывать, нет акцентов — непонятно, что главное, а что второстепенное. Создатель этого лого просто «поиграл в тетрис», пытаясь сложить все детали в компактный прямоугольник:
                            image
                            В итоге получилась несоразмерно большая «Р», эмблема-цветок, которая зависла в случайном месте и дескриптор, который не по чему не выровнен. Сравните, насколько понятнее была бы, например, такая композиция:
                            image
                            Элементы всё те же, за исключением гигантской буквы Р, но расположение более простое и понятное. Давайте применим эту схему:
                            image
                            Мы поменяли расположение и размеры элементов. Получилось не идеально, но лучше, чем в оригинале. При составлении композиции надо смотреть на взаимное подчинение и расположение объектов, а не просто «играть в тетрис», загоняя элементы в пустые места. Тогда будут правильно расставлены акценты, знаки будут лучше восприниматься и узнаваться, а надписи будет легче читать.

                            Как итог

                            image

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

                            И, как всегда, удачи вам и вашим проектам!
                            Original source: habrahabr.ru (comments, light).

                            https://habrahabr.ru/post/338270/


                            Метки:  

                            [Перевод] DevOps с Kubernetes и VSTS. Часть 2: Облачная история

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

                            DevOps с Kubernetes и VSTS. Часть 2: Облачная история

                            • Перевод
                            • Tutorial
                            Продолжение истории про Kubernetes, контейнеры и организацию CI/CD пайплайна. Наконец-то появляется облако Azure и Visual Studio Team Services. Интересно, что CI/CD пайплайн VSTS использует для работы с k8s кластером kubectl, поэтому развёртывать приложение можно не только в Azure Container Services, но и в любой другой инстраляции Kubernetes.



                            Читайте перевод второй части статьи DevOps с Kubernetes и VSTS.

                            Цикл статей «DevOps с Kubernetes и VSTS»


                            1. Локальная история
                            2. Облачная история

                            В первой части я продемонстрировал подход к разработке многоконтейнерных приложений с использованием Kubernetes (k8s), а точнее minikube, полноценной среды k8s, которая запускает один узел на виртуальной машине на вашем ноутбуке. В предыдущей статье я клонировал этот репозиторий (убедитесь, что развернута ветка docker) с двумя контейнерами: DotNet Core API и frontend SPA (Aurelia) (в виде статических файлов в приложении DotNet Core app). Я показал, как создавать контейнеры локально и запускать их в minikube, а также использовать возможности ConfigMaps для работы с конфигурациями.

                            В этой статье я расскажу вам, как перенести локальную разработку в CI/CD и создать конвейер для автоматизированного формирования сборки/выпуска с использованием VSTS. Мы создадим реестр контейнеров и службы контейнеров в Azure, используя k8s в качестве механизма оркестрации.

                            CI/CD пайплайн для Kubernetes в VSTS


                            Настоятельно рекомендую вам изучить прекрасный начальный курс Найджела Поултона (Nigel Poulton) под названием Getting Started with Kubernetes на PluralSight (прим. переводчика — на английском языке, нужна платная подписка), а также статью Атула Малавия (Atul Malaviya) из Microsoft. Курс Найджела стал превосходным погружением в Kubernetes для новичков, а статья Атула помогла понять принципы взаимодействия VSTS и k8s, но ни курс, ни статья не охватили конвейер полностью. Из них я так и не понял, как в конвейере CI/CD реализовано обновление образов. Что ж, пришлось самому провести ряд экспериментов и подготовить эту статью!

                            Развертывание среды k8s с помощью служб контейнеров Azure


                            k8s можно запускать локально, в AWS или Google Cloud или Azure. Мы будем использовать службу контейнеров Azure (Azure Container Service). Однако, конвейер CI/CD, который я демонстрирую в этой статье, не зависит от конкретного облачного хостинга, он подходит для любого кластера k8s. Мы также создадим приватный реестр контейнеров в Azure, но вы, опять же, можете использовать любой реестр контейнеров по своему выбору.

                            Создать кластер k8s можно и на портале Azure. Однако Azure CLI позволяет сделать это быстрее, и вы сохраните ключи, которые понадобятся для подключения, поэтому я решил использовать этот механизм. Я также буду использовать Bash для Windows с kubectl, но подойдет любая платформа с kubectl и Azure CLI.

                            Вот команды:

                            # set some variables
                            export RG="cd-k8s"
                            export clusterName="cdk8s"
                            export location="westus"
                            # create a folder for the cluster ssh-keys
                            mkdir cdk8s
                             
                            # login and create a resource group
                            az login
                            az group create --location $location --name $RG
                             
                            # create an ACS k8s cluster
                            az acs create --orchestrator-type=kubernetes --resource-group $RG --name=$ClusterName --dns-prefix=$ClusterName --generate-ssh-keys --ssh-key-value ~/cdk8s/id_rsa.pub --location $location --agent-vm-size Standard_DS1_v2 --agent-count 2
                             
                            # create an Azure Container Registry
                            az acr create --resource-group $RG --name $ClusterName --location $location --sku Basic --admin-enabled
                             
                            # configure kubectl
                            az acs kubernetes get-credentials --name $ClusterName --resource-group $RG --file ~/cdk8s/kubeconfig --ssh-key-file ~/cdk8s/id_rsa
                            export KUBECONFIG="~/cdk8s/kubeconfig"
                             
                            # test connection
                            kubectl get nodes
                            NAME                    STATUS                     AGE       VERSION
                            k8s-agent-96607ff6-0    Ready                      17m       v1.6.6
                            k8s-agent-96607ff6-1    Ready                      17m       v1.6.6
                            k8s-master-96607ff6-0   Ready,SchedulingDisabled   17m       v1.6.6
                            

                            Примечания:

                            • Строки 2–4: создаем переменные.
                            • Строка 6: создаем каталог для ssh-ключей и файла конфигурации kubeconfig.
                            • Строка 9: входим в систему в Azure (запрос на открытие в браузере страницы с меню входа; если у вас нет подписки Azure, создайте бесплатную прямо сейчас!).
                            • Строка 10: создаем группу для размещения всех ресурсов, которые мы собираемся создать.
                            • Строка 13: развертываем кластер k8s с использованием только что созданной группы ресурсов и имени, которое мы передаем; генерируем ssh-ключи и помещаем в указанный каталог; нам нужны два агента (узла) с указанным размером виртуальной машины.
                            • Строка 16: создаем реестр контейнеров Azure в той же группе ресурсов с доступом от имени администратора.
                            • Строка 19: получаем учетные данные для подключения к кластеру с помощью kubectl; используем полученный ssh-ключ и сохраняем учетные данные в указанном файле kubeconfig.
                            • Строка 20: просим kubectl использовать эту конфигурацию вместо конфигурации по умолчанию (которая может иметь другие кластеры k8s или конфигурацию minikube).
                            • Строка 23: проверяем возможность подключения к кластеру.
                            • Строки 24–27: мы успешно подключаемся!

                            Если вы запустите браузер, перейдете на портал Azure и откроете свою группу ресурсов, то увидите, сколько всего было создано этими простыми командами:



                            Не беспокойтесь, самостоятельно управлять ресурсами вам не придется. Azure и кластер k8s берут это на себя!

                            Пространства имен


                            Прежде чем мы создадим сборку и выпуск для наших контейнерных приложений, давайте рассмотрим модель продвижения. Обычно схема примерно такая: разработка -> пользовательские приемочные испытания -> производственная среда (Dev -> UAT -> Prod). В случае c k8s, minikube представляет собой локальную среду разработки, и это здорово. Это полноценный кластер k8s на вашем ноутбуке, поэтому вы можете запускать свой код локально, в том числе с помощью таких конструктов k8s, как configMaps. А как быть с UAT и Prod? Вариант — развернуть отдельные кластеры, но такой подход может оказаться дорогостоящим. Также вы можете обеспечить совместное использование ресурсов кластера с помощью пространств имен.

                            Пространства имен в k8s выступают в качестве рубежей безопасности, но они также могут стать границами изоляции. Я могу развернуть новые версии моего приложения в пространстве имен dev, которое будет использовать ресурсы пространства имен prod, но при этом останется полностью невидимым (собственные IP-адреса и т. д.). Разумеется, не следует проводить нагрузочное тестирование в рамках такой конфигурации, поскольку мы будем потреблять значительные ресурсы, предназначенные для приложений в производственной среде. Эта концепция напоминает слоты развертывания в службах приложений Azure, которые используются для незаметного тестирования приложений перед их передачей в производственную среду.

                            Если вы создаете кластер k8s, то помимо пространств имен kube-system и kube-public (с подами k8s) получаете пространство имен по умолчанию. При отсутствии четких указаний с вашей стороны любые службы, развертывания или поды, которые вы создадите, попадают в это пространство имен. Но мы создадим два дополнительных пространства имен: dev и prod. Вот наш yaml:

                            apiVersion: v1
                            kind: Namespace
                            metadata:
                              name: dev
                            ---
                            apiVersion: v1
                            kind: Namespace
                            metadata:
                              name: prod
                            

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

                            kubectl apply -f namespaces.yml
                            namespace "dev" created
                            namespace "prod" created
                             
                            kubectl get namespaces
                            NAME          STATUS    AGE
                            default       Active    27m
                            dev           Active    20s
                            kube-public   Active    27m
                            kube-system   Active    27m
                            prod          Active    20s
                            

                            Настройка секрета для реестра контейнеров


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

                            az acr credential show --name $ClusterName --output table
                            USERNAME    PASSWORD                          PASSWORD2
                            ----------  --------------------------------  --------------------------------
                            cdk8s       some-long-key-1                   some-long-key-2
                            
                            kubectl create secret docker-registry regsecret --docker-server=$ClusterName.azurecr.io --docker-username=$ClusterName --docker-password= --docker-email=admin@azurecr.io
                            secret "regsecret" created
                             

                            Первая команда использует az, чтобы получить ключи для пользователя с правами администратора (имя пользователя с правами администратора совпадает с именем реестра контейнеров, поэтому я создал cdk8s.azurecr.io, и имя пользователя-администратора будет cdk8s). Передайте один из ключей (неважно, какой) в качестве пароля. Адрес электронной почты не используется, поэтому можете указать какой угодно. Теперь у нас есть секрет реестра с именем regsecret, на который мы можем ссылаться, выполняя развертывание в кластере k8s. K8s будет использовать этот секрет для проверки подлинности в реестре.

                            Настройка конечных точек VSTS


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

                            Запустите VSTS и откройте командный проект (или просто создайте новый). Перейдите в командный проект и нажмите значок шестеренки, чтобы открыть узел настроек для этого командного проекта. Щелкните Services. Щелкните + New Services и создайте новую конечную точку Docker Registry. Введите те же учетные данные, которые вы использовали для создания секрета реестра в k8s с помощью kubectl:



                            Теперь создайте конечную точку k8s. Введите URL: https://$ClusterName.$location.cloudapp.azure.com (clustername и location — переменные, которые мы использовали при создании кластера). Необходимо скопировать в текстовое поле для учетных данных все содержимое файла ~/cdk8s/kubeconfig (вы могли назвать его по-другому), который был создан после выполнения команды az acs kubernetes get-credential:



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



                            Сборка


                            Теперь мы можем создать сборку, которая будет компилировать/тестировать наш код, создавать образы docker и помещать их в реестр контейнеров, соответствующим образом помечая их. Щелкните Build & Release, а затем — Builds, чтобы открыть узел сборки. Создайте новое определение сборки. Выберите шаблон ASP.NET Core и нажмите Apply. Необходимо выполнить следующие настройки:

                            • Tasks -> Process: введите имя, например k8s-demo-CI, и выберите очередь Hosted Linux Preview.
                            • Опционально: измените формат номера сборки на 1.0.0$(rev:.r), чтобы ваши сборки имели формат 1.0.0.x.
                            • Tasks -> Get Sources: выберите репозиторий Github с проверкой подлинности OAuth или PAT. Выберите AzureAureliaDemo, а затем docker в качестве ветки по умолчанию. Возможно, вам придется создать «вилку» для репозитория (или просто импортировать его в VSTS), если вы выполняете действия вместе со мной.
                            • Tasks -> DotNet Restore: не вносите никаких изменений.
                            • Tasks -> DotNet Build: добавьте --version-suffix $(Build.BuildNumber) в аргументы сборки, чтобы обеспечить соответствие версии и номера сборки.
                            • Tasks -> DotNet Test: отключите эту задачу, поскольку в нашем решении не применяются тесты DotNet (конечно, если у вас будут тесты, задачу можно снова включить).
                            • Tasks -> добавьте задачу npm. В качестве рабочего каталога выберите frontend и убедитесь, что используется команда install.
                            • Tasks -> добавьте задачу Command line. В качестве инструмента (tool) выберите node, укажите аргументы: node_modules/aurelia-cli/bin/aurelia-cli.js test и рабочий каталог: frontend. Так вы запустите тесты Aurelia.
                            • Tasks -> добавьте задачу Publish test results. В поле Test Results files укажите test*.xml, а в поле Search Folder введите $(Build.SourcesDirectory)/frontend/testresults. Так вы опубликуете результаты тестов Aurelia.
                            • Tasks -> добавьте задачу Publish code coverage. В поле Coverage Tool введите Cobertura, в поле Summary File — $(Build.SourcesDirectory)/frontend/reports/coverage/cobertura.xml, в поле Report Directory — $(Build.SourcesDirectory)/frontend/reports/coverage/html. Так вы опубликуете данные о покрытии тестов Aurelia.
                            • Tasks -> добавьте задачу Command line. В качестве инструмента (tool) выберите node, укажите аргументы: node_modules/aurelia-cli/bin/aurelia-cli.js test и рабочий каталог: frontend. Так вы скомпилируете, обработаете и упакуете приложение Aurelia SPA.
                            • Tasks -> DotNet Publish. В качестве аргументов введите -c $(BuildConfiguration) -o publish и снимите флажок Zip Published Projects.
                            • Tasks -> добавьте задачу Docker Compose. В поле Container Registry Type укажите Azure Container Registry, в качестве подписки и реестра контейнеров Azure укажите реестр, для которого мы создали конечную точку ранее. В поле Additional Docker Compose Files укажите docker-compose.vsts.yml, в поле Action — Build service images, в поле Additional Image Tags — $(Build.BuildNumber), чтобы номер сборки использовался в качестве тега для образов.
                            • Создайте клон задачи Docker Compose. В качестве имени укажите Push service images и выберите действие Push service images. Установите флажок Include Latest Tag.
                            • Tasks -> Publish Artifact. В полях Path to Publish и Artifact Name выберите k8s. Так вы опубликуете файлы k8s yaml, чтобы включить их в выпуск.

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



                            Теперь можно нажать Save and Queue, чтобы сохранить сборку и поставить ее в очередь. По завершении процесса создания сборки вы увидите сводную информацию о тестировании/покрытии.



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



                            Выпуск


                            Теперь мы можем настроить выпуск, который будет создавать/обновлять нужные службы. Для этого следует обеспечить управление конфигурацией. Можно было просто включить конфигурацию в код, но в таком случае конфиденциальные данные (например, пароли) попали бы в инструмент управления версиями. Я предпочитаю «токенизировать» любую конфигурацию, чтобы решение для управления выпусками размещало конфиденциальные данные за пределами зоны, контролируемой инструментом управления версиями. Решение VSTS Release Management позволяет создавать секреты для отдельных сред или выпусков, также вы можете создавать их в группах переменных с поддержкой повторного использования. Кроме того, теперь поддерживается бесшовная интеграция с Azure Key Vault.

                            Чтобы вместо токенов использовать значения, специфичные для среды, нам нужна задача для замены токена. К счастью, у меня есть кросс-платформенная задача ReplaceTokens из модуля расширения Colin's ALM Corner Build & Release Tasks, который я скачал из магазина VSTS Marketplace. Щелкните ссылку, чтобы перейти на нужную страницу, затем нажмите Install, чтобы установить расширение для своей учетной записи.

                            На странице сводной информации о сборке прокрутите бегунок справа до раздела Deployments и щелкните ссылку Create release. Также можете щелкнуть Releases и создать новое определение оттуда. Начните с пустого шаблона (Empty), выберите свой командный проект и сборку, которую вы только что создали, в качестве исходной сборки. Поставьте флажок Continuous Deployment, чтобы выпуск создавался автоматически для каждой правильной сборки.

                            В качестве имени для определения укажите k8s или что-то описательное. На вкладке General измените формат номера выпуска на $(Build.BuildNumber)-$(rev:r), чтобы по имени выпуска всегда можно было без труда определить номер сборки. Вернитесь в раздел Environments и вместо Environment 1 введите dev. Щелкните ссылку Run on Agent и убедитесь, что в поле Deployment queue выбрано Hosted Linux Preview.

                            Добавьте следующие задачи:

                            • Replace Tokens.
                              • Source Path: в проводнике откройте каталог k8s.
                              • Target File Pattern: *-release.yml. Таким образом, токен будет заменен в любом файле yml с именем, которое оканчивается на -release. Таких файлов три: файлы службы/развертывания для сервера и клиента, а также файл конфигурации клиента. Эта задача находит токены в файле (с префиксом и постфиксом __) и ищет переменные с таким же именем. Каждая переменная заменяется своим значением. Через некоторое время мы создадим переменные.
                            • Kubernetes Task 1 (применить конфигурацию для клиента).
                              • Настройте подключение k8s к созданной ранее конечной точке. Также необходимо настроить подключение к реестру контейнеров Azure. Это касается всех задач Kubernetes. В поле Command выберите apply, поставьте флажок Use Configuration Files и укажите файл k8s/app-demo-frontend-config-release.yml с помощью средства выбора файлов. Укажите --namespace $(namespace) в текстовом поле для аргументов.
                            • Kubernetes Task 2 (применить определение службы/развертывания на стороне сервера).
                              • Задайте одинаковые параметры подключения для службы k8s и реестра контейнеров Azure. В этот раз в поле Secret Name укажите regsecret (это имя секрета, который мы создали при настройке кластера k8s, а также имя, на которое мы ссылаемся в параметре imagePullSecret в определениях развертывания). Поставьте флажок Force update secret. Это обеспечит совпадение значений секрета k8s и ключа из Azure. Этот параметр можно было пропустить, поскольку ключ мы создали вручную.
                              • В поле Command выберите apply, поставьте флажок Use Configuration Files и укажите файл k8s/app-demo-backend-release.yml с помощью средства выбора файлов. Укажите --namespace $(namespace) в текстовом поле для аргументов.

                            • Kubernetes Task 3 (применить определение службы/развертывания на стороне клиента).
                              • Настройки аналогичны предыдущей задаче, только выбираем файл k8s/app-demo-frontend-release.yml.
                            • Kubernetes Task 4 (обновить образ на стороне сервера).
                              • Задайте одинаковые параметры подключения для службы k8s и реестра контейнеров Azure. Секрет здесь не требуется. В поле Command выберите set, а в поле Arguments укажите image deployment/demo-backend-deployment backend=$(ContainerRegistry)/api:$(Build.BuildNumber) --record --namespace=$(namespace).
                              • Так вы обновите версию (тег) используемого образа контейнера. K8s выполнит последовательное обновление, запустив новые контейнеры и отключив старые, и служба все это время будет работоспособна.

                            • Kubernetes Task 5 (обновить образ на стороне клиента).
                              • Параметры аналогичны предыдущей задаче, только в поле Arguments необходимо указать image deployment/demo-frontend-deployment frontend=$(ContainerRegistry)/frontend:$(Build.BuildNumber) --record --namespace=$(namespace)
                            • Нажмите кнопку «…» на карточке dev и щелкните Configure Variables для настройки переменных. Задайте следующие значения:
                              • BackendServicePort: 30081
                              • FrontendServicePort: 30080
                              • ContainerRegistry: <ваше реестр контейнеров>.azurecr.io
                              • namespace: $(Release.EnvironmentName)
                              • AspNetCoreEnvironment: development
                              • baseUri: http://$(BackendServiceIP)/api
                              • BackendServiceIP: 10.0.0.1


                            Так задаются специфичные для среды значения для всех переменных в файлах yml. Задача Replace Tokens запишет для нас нужные значения в файлы. Давайте быстро посмотрим на один из токенизированных файлов (токенизированные строки выделены):

                            apiVersion: v1
                            kind: Service
                            metadata:
                              name: demo-frontend-service
                              labels:
                                app: demo
                            spec:
                              selector:
                                app: demo
                                tier: frontend
                              ports:
                                - protocol: TCP
                                  port: 80
                                  nodePort: __FrontendServicePort__
                              type: LoadBalancer
                            ---
                            apiVersion: apps/v1beta1
                            kind: Deployment
                            metadata:
                              name: demo-frontend-deployment
                            spec:
                              replicas: 2
                              template:
                                metadata:
                                  labels:
                                    app: demo
                                    tier: frontend
                                spec:
                                  containers:
                                    - name: frontend
                                      image: __ContainerRegistry__/frontend
                                      ports:
                                      - containerPort: 80
                                      env:
                                      - name: "ASPNETCORE_ENVIRONMENT"
                                        value: "__AspNetCoreEnvironment__"
                                      volumeMounts:
                                        - name: config-volume
                                          mountPath: /app/wwwroot/config/
                                      imagePullPolicy: Always
                                  volumes:
                                    - name: config-volume
                                      configMap:
                                        name: demo-app-frontend-config
                                  imagePullSecrets:
                                    - name: regsecret
                            

                            Комментарий относительно значения для BackendServiceIP: мы используем 10.0.0.1 в качестве замещающего текста, так как Azure присвоит IP-адрес этой службе, когда k8s запустит службу на стороне сервера (вы увидите общедоступный IP-адрес в группе ресурсов на портале Azure). Нам нужно будет выполнить это один раз, чтобы создать службы, а затем обновить, чтобы получить реальный IP-адрес и обеспечить работоспособность службы на стороне клиента. Мы также используем $(Release.EnvironmentName) в качестве значения для namespace, поэтому для dev (а затем и для prod) пространства имен должны совпадать с теми, что создали мы (включая регистр символов).

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

                            Сохраните определение. Щелкните + Release, чтобы создать новый выпуск. Щелкните по номеру выпуска (это будет что-то вроде 1.0.0.1-1), чтобы открыть его. Щелкните logs, чтобы просмотреть журналы.



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

                            az acs kubernetes browse -n $ClusterName -g $RG --ssh-key-file ~/cdk8s/id_rsa
                             
                            Proxy running on 127.0.0.1:8001/ui
                            Press CTRL+C to close the tunnel...
                            Starting to serve on 127.0.0.1:8001
                            

                            Последний аргумент — это путь к файлу SSH-ключа, который генерируется при создании кластера (укажите актуальный путь). Теперь можно открыть в браузере страницу http://localhost:8001/ui. В раскрывающемся меню namespace выберите dev и щелкните Deployments. Вы должны увидеть два успешных развертывания с двумя работоспособными подами в каждом. Вы также можете увидеть образы, которые запускаются в развертываниях. Обратите внимание на номер сборки, указанный в качестве тега!



                            Чтобы увидеть службы, щелкните Services.



                            Теперь у нас есть IP-адрес службы на стороне сервера, поэтому мы можем обновить переменную в выпуске. Затем мы можем поставить в очередь новую версию, и на этот раз в конфигурации клиента будет указан правильный IP-адрес для службы на стороне сервера (в нашем случае это 23.99.58.48). Мы можем ввести IP-адрес нашей клиентской службы в браузере и убедиться, что теперь все работает!



                            Создание производственной среды


                            Теперь, когда мы убедились в работоспособности среды dev, мы можем вернуться к выпуску, клонировать среду dev и назвать копию prod. Укажите одобрение постфактум для dev (или предварительное одобрение для prod), чтобы между двумя средами была контрольная точка.



                            Затем мы можем просто изменить порты для узлов, а также значения переменных AspNetCoreEnvironment и BackendServiceIP, и готово! Разумеется, нам нужно сначала выполнить развертывание в пространстве имен prod, прежде чем мы увидим IP-адрес, назначенный k8s/Azure для сервера prod. Затем необходимо повторно запустить процедуру создания выпуска, чтобы обновить конфигурацию.



                            Мы могли бы удалить параметр nodePort из определений и позволить платформе k8s самой выбрать порт узла, но если порт указан явным образом, то мы будем точно знать, какой порт служба будет использовать в кластере (не для доступа извне).

                            Мне не нравится указывать --namespace для каждой команды, настолько не нравится, что я создал запрос Pull Request в репозитории vsts-tasks на Github, чтобы дать доступ к пространству имен в качестве дополнительного элемента пользовательского интерфейса!

                            Проход по всему CI/CD конвееру


                            Теперь, когда наши среды dev и prod в конвейере CI/CD настроены, мы можем внести изменения в код. Я поменяю текст под версией на «K8s demo» и применю изменения. Так мы инициируем сборку, создание более нового образа контейнера и выполнение тестов, что, в свою очередь, запустит выпуск в среде dev. Теперь я вижу изменение в среде dev (версия 1.0.0.3 или более новая, то есть больше, чем 1.0.0.1), в то время как версия prod все еще равна 1.0.0.1.



                            Одобрите dev в решении для управления выпусками, и процесс для prod запустится, через несколько секунд версия prod также будет равна 1.0.0.3.

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

                            Заключение


                            k8s имеет большой потенциал как надежный механизм оркестрации контейнеров. Технология yml позволяет реализовать концепцию «инфраструктура как код» и отлично подходит для управления версиями. Механизм развертывания сводит к минимуму или вовсе устраняет время простоя при развертывании, а возможность использования configMaps и секретов обеспечивает безопасность всего процесса. Интерфейс командной строки Azure CLI позволяет создать кластер k8s и реестр контейнеров Azure при помощи пары простых команд. Интеграция с VSTS с помощью задач k8s упрощает настройку конвейера CI/CD, вместе они формируют оптимальный рабочий процесс разработки. А с учетом решения minikube, о котором я писал в первой части этой серии статей и который предоставляет вам полноценный кластер k8s для локальной разработки на вашем ноутбуке, вы получаете отличный рабочий процесс разработки, непрерывной интеграции и непрерывного развертывания (Dev/CI/CD).

                            Разумеется, конвейер CI/CD не проводит нагрузочное тестирование реальных приложений в производственной среде! Я хотел бы узнать о вашем опыте применения k8s в производственных средах. Пишите в комментариях, если у вас есть опыт запуска приложений в кластере k8s в производственной среде!

                            Удачи вам с k8sing!



                            P.S. Благодарим Константина Кичинского (Quantum Quintum) за иллюстрацию к этой статье.
                            Original source: habrahabr.ru (comments, light).

                            https://habrahabr.ru/post/337708/


                            Метки:  

                            [Из песочницы] Пишем для UEFI BIOS в Visual Studio. Часть 1 — разворачивание среды разработки, компиляция и запуск на отладку

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

                            Пишем для UEFI BIOS в Visual Studio. Часть 1 — разворачивание среды разработки, компиляция и запуск на отладку

                            Введение


                            В этой статье будет описано, как быстро начать программировать для UEFI во фреймворке edk2 в среде Visual Studio, не тратя массу времени на настройку среды обычным способом, по оригинальным мануалам. Достаточно дать команду git clone ... в корневом каталоге диска, и это на самом деле все, среда будет полностью установлена и готова к работе. Требуются 64-разрядная Windows 7 и выше c Visual Studio 2008-2016. Эти два условия не обязательны, но тогда придется немного потрудиться над собиранием системы edk2-Visual Studio в единое целое, краткая памятка будет приведена.

                            Цель статьи — провести начинающего за руку по первому UEFI проекту, оставаясь в привычной ему среде. Для более опытных людей, надеюсь, будет интересным поработать в VS вместо привычной командной строки, или разобрать подход и перенести его в любимый Eclipse.

                            Начнем с простых вещей, вывода строки на консоль и русификации (довольно востребованная вещь, причем простая в реализации), потом будет работа с формами в HII (то, что называлось в обиходе страницами BIOS Setup), потом графика, потом Boot Manager, а потом видно будет (с).


                            Желающие — прошу пожаловать под кат.

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

                            Вначале хорошее


                            1) Аппаратура не понадобится от слова совсем. Никаких Evaluation Boards, никаких Intel BlueBox JTAG за $3000. Все будет отлаживаться в 32-битной виртуальной машине OVMF – портированной Интелом виртуалке qemu для отладки UEFI Firmware. Для перекомпиляции под реальную платформу достаточно потом — после отладки — переставить пару ключей в настройках компиляции, и на этом все.

                            2) Работать будем со всеми возможностями Visual Studio, т.е. доступны breakpoints, watch, step execution и остальное. Перекомпиляция и запуск несложного модуля занимает 8-10 секунд.

                            3) Файловая система виртуалки доступна на Windows-машине для записи-чтения. Очень пригодится, если надо будет редактировать скрипты UEFI Shell, после запуска посмотреть скриншоты и проанализировать логи средствами Windows.

                            4) Никакого ассемблера, только С/С++.

                            Теперь о том, что мы делать не будем


                            1) Мы будем работать в DXE (где уже есть UEFI Shell) и поздних фазах. В более ранние фазы не полезем, поскольку нас туда никто не пустит, по крайней мере – для Intel-процессоров. Позже будет объяснение, почему. Если хотите сделать полный цикл, от включения до загрузки ОС, причем быстро и не забивая голову кучей ненужной и неинтересной вам в данный момент информацией, а ручное конфигурирование системы вам совершенно не требуется – дальше не читайте, а наберите в Гугле «coreboot».

                            2) «Графического» UEFI с мышкой и кнопками, как у Dell, MSI и прочих, здесь не будет. Это платные среды, для использования в крупных компаниях. Есть, разумеется, энтузиасты, которые сами создают их своими руками, не ответив предварительно на вопрос «Зачем?», но обычно их энтузиазм заканчивается на второй форме с кнопками.

                            3) Мы будем работать с компилятором Visual Studio. Желающие могут настроить gcc в cygwin, или icc, но в данный момент не стоит задача получить оптимальный быстрый код, а стоит задача быстро пройти путь к началу полноценной работы.
                            Все, предварительные танцы закончены, кто надо – воодушевлен, кто надо – напуган.

                            Переходим к делу


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

                            Итак, у кого на машине есть git в командной строке, выполняют команду в cmd окне (или в Far Commander, не суть) из корневого каталога:
                            git clone https://github.com/ProgrammingInUEFI/FW
                            а те, у кого нет, идут по ссылке на github, скачивают zip-файл и раскрывают его в каталог с:/FW.

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



                            Конфигурирование среды для версии, отличной от VS2010


                            Открываем файл c:\FW\edk2\Conf\target.txt и в строчке
                            TOOL_CHAIN_TAG = VS2010x86
                            Заменяем VS2010x86 на тэг установленной у вас версии Visual Studio. Для Visual Studio 2010 тэг останется как есть, для других версий VS – смотрите картинку выше, или список в начале файла c:\FW\edk2\Conf\tools_def.txt
                            Собственно, среда разработки edk2 развернута полностью и в ней можно работать из командной строки. Некоторые так и работают всю жизнь («угорать по хардкору, поддерживать дух старой школы и всё такое» — (с) CodeRush в своей ставшей классической статье). Но мы все же пойдем дальше, пересаживать человека из MSVS обратно в командную строку — негуманно, особенно в 2017.

                            Настраиваем проект в Visual Studio


                            Открываем Visual Studio, в нем открываем Solution NT32.sln из каталога C:\FW\VS\NT32. В целях уменьшения времени входа в тему, в solution уже создан одноименный проект NT32, в котором уже сделаны описанные ниже настройки. Это если не получится создать самим – чтобы иметь гарантированно рабочие настройки проекта. Такой подход сильно сократит время поиска источника проблем, в случае их появления. Тем не менее, лучше пройти описанный ниже путь самим, и понять смысл настроек – это облегчит настройку следующих проектов.

                            Небольшой совет для тех, кто загорелся всерьез
                            Полезно будет сразу в Tools->Options настроить рабочий каталог на c:\FW\VS, но если в VS ведется другой, рабочий проект, то так делать не надо:



                            Итак, по шагам:

                            Создание проекта


                            Создаем в Solution NT32 новый проект для Visual C++ (правой клавишей на Solution NT32, Add->New Project, выбираем опцию Makefile Project), и назовем его MyFirstUEFIProject (или как угодно еще). Жмем Finish.



                            Выбираем в Solution проект NT32, выбираем из контекстного меню Project->Properties и производим настройки проекта.

                            Настройка NMake опций


                            Выбираем в окне слева строку Configurarion Properties ->NMake, в окне справа — строку Build Command Line



                            Жмем Edit… и в открывшемся текстовом окне вводим:

                            set NASM_PREFIX=C:\FW\NASM\
                            call c:\FW\edk2\edksetup.bat --nt32
                            build

                            Сейчас стоит немного объяснить, что мы делаем. По сути, мы пишем в этом окне обычный пакетный bat-файл вместо makefile.

                            В первой строке устанавливается переменная окружения ассемблера NASM_PREFIX в том виде, как ее понимает edk2, то есть путь, по которому лежит файл nasm.exe. На ассемблере мы сами писать не будем, но нашей системе сборки ассемблер нужен обязательно.

                            Во второй строке вызывается скрипт настройки среды edk2 и настраиваются переменные окружения для данного сеанса компиляции и запуска (вне VS эти переменные не отражаются). Ключ –nt32 указывает системе сборки, что компилировать исходники надо для пакета (package) Nt32Pkg, расположенного в C:\FW\edk2\Nt32Pkg. Этих пакетов там много, мы их рассмотрим, но не сейчас.

                            В третьей строке мы даем команду на компиляцию в только что настроенной среде (build.exe лежит в C:\FW\edk2\BaseTools\Bin\Win32, этот путь прописывается в предыдущей строчке, в edksetup.bat)

                            Итак, вот что у нас должно появиться в итоге в текстовом окне Build Command Line:



                            Затем вводим в следующей строке Rebuild Command Line в открывшееся по Edit … окно следующий текст

                            set NASM_PREFIX=C:\FW\NASM\
                            call c:\FW\edk2\edksetup.bat --nt32 
                            build clean
                            build

                            Команда build clean означает то самое, что вы предполагаете. Она делает полную перестройку проекта с перекомпиляцией всех модулей.

                            Что мы вводим в окне из Clean Command Line, наверное, все уже догадались:

                            set NASM_PREFIX=C:\FW\NASM\
                            call  c:\FW\edk2\edksetup.bat --nt32 
                            build clean

                            Честно говоря, особо эта опция не нужна, в 99% случаев хватит Rebuild, но пускай будет – например, очистить среду для ее переноса в другое место или заливки на github.
                            В итоге, у нас должно получиться вот такое окно:



                            Все с настройкой NMake.

                            Настройка опции Debugging


                            Итак, открываем строчку Debugging и вводим:
                            В строчке Command:

                            C:\FW\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\SecMain.exe

                            В строчке “Working Directory”:

                            C:\FW\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\

                            Пара комментариев:
                            SecMain.exe – объяснять сейчас, что это такое – долго, если очень кратко и упрощенно – то это аналог bootloader-a, который запускает все остальное.
                            Рабочий каталог – сюда будут помещаться все успешно созданные модули, и доступны они будут все сразу из командной строки.

                            Итак, вот что мы должны получить после настроек в этом окне:



                            На этом все с настройками проекта.

                            Построение проекта


                            Вызываем Build Solution, смотрим на экран примерно минуту, в течение которой есть наибольший риск быть обруганным компилятором, и идем пить кофе – создаваться это все будет 10-15 мин, в зависимости от ресурсов вашего компьютера. Ничто нудное не вечно, и в конце концов мы получаем сообщение:
                            ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
                            Если же вместо этого получено что-то иное, смотрите, правильно ли вы прошли все шаги. Наиболее тяжелый случай – получить:
                            LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
                            это баг среды VS2010 и означает, что VS2010 установлен без SP1. Поставьте SP1, или ищите способы затыкания этой ошибки в инете.

                            Если же получили ошибку и из сообщений компилятора не понятно, что это такое – переставьте дефолтный проект на NT32 и запустите его на компиляцию с отладкой. Если и там ошибка – проверьте еще раз соответствие TOOL_CHAIN_TAG предопределенным значениям, описанным в tools_def.txt. Больше ничего там упираться не может, разве что сам Visual Studio установлен, хм, не вполне стандартно, или использует сторонний компилятор.

                            Работа в UEFI Shell


                            Итак, все скомпилялось хорошо, и вы читаете эти строки. Теперь жмем на любимую F5 и после примерно минуты работы с диском (чуть позже сократим и это время) получаем вот такую требуемую картинку:



                            Собственно, это и есть UEFI Shell. Как в нем работать – написана куча руководств, посмотрите в Гугле, а мы пока сделаем в нем несколько вещей.

                            1. Смотрим, что мы там накомпиляли за эти 10 минут. Вводим fs0 (UEFI Shell нечувствителен к регистру) и затем ls –b, где опция –b означает ожидание нажатия Enter для прокрутки страницы, ибо список там большой, не на один экран.
                            Теперь стало понятно, что означал параметр “Working Directory” в настройке опций проекта Visual Studio — C:\FW\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\. Там этот же самый список файлов, и лучше его смотреть (и редактировать скрипты) через развитую оболочку Far Commander (или Total Commander), чем с командной строки в UEFI Shell.

                            2. В UEFI Shell и набираем “hel”, жмем Tab и видим на экране Helloworld.efi. Не то, чтобы мы совсем не догадывались, что будет, если нажать после этого Enter, но проверить-то надо! Жмем и получаем троекратное UEFI Hello World!. Число повторений – это конфигурируемый в настройках среды (а не в исходниках) внешний параметр и мы будем эту конфигурацию потом разбирать.

                            3. Набираем exit и попадаем в наше любимое и знакомое окно:


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

                            Выводим свою строку


                            Создание полностью своего приложения потребует достаточно много настроек, которые лучше будет рассмотреть в следующей статье — иначе получится большой объем, а длинные простыни никто не читает. Однако же в заголовке этой статьи написано «Программирование», а мы пока занимались только настройкой. Чтобы сдержать обещание, давайте в этой статье сделаем очень простую модификацию приложения HelloWorld, используя его имеющийся набор файлов, а в следующей статье создадим свой, при помощи Интеловской утилиты UEFI Driver Wizard, поскольку прогонять начинающих по полному циклу создания набора файлов для UEFI драйвера (или приложения) — это нечеловеколюбиво, дико рутинно и несет риск потери 90% аудитории. Если человека зацепит — он сам к этому придет со временем, а если хочется просто поиграться — нет смысла тратить на это кучу времени, благо многое давно уже делается автоматически через UEFI Driver Wizard, причем по фэн-шуй, чего от новичка ждать наивно.

                            Итак, открываем в Visual Studio файл
                            C:\FW\edk2\MdeModulePkg\Application\HelloWorld\HelloWorld.c

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

                            Print (L"I did it in UEFI!\r\n");

                            Разумеется, текст можно заменить на что угодно, только английскими буквами — русский шрифт edk2 еще не понимает, мы добавим его в следующих статьях. Можете поставить на эту строку обычный breakpoint и посмотреть, как себя поведет Visual Studio.
                            Жмем F5, после компиляции и устранения ошибок вводим «fs0», HelloWorld и получим такой вывод:



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

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

                            https://habrahabr.ru/post/338264/


                            Метки:  

                            Платформа ServiceNow: тематическая подборка материалов для начинающих

                            Вторник, 19 Сентября 2017 г. 16:29 + в цитатник
                            it-guild сегодня в 16:29 Управление

                            Платформа ServiceNow: тематическая подборка материалов для начинающих

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

                              / Flickr / Dean Hochman / CC

                              Самые популярные вопросы при внедрении ServiceNow. Краткий ликбез по теме, с которого мы рекомендуем начать «погружение». Здесь мы рассказываем, из чего складывается стоимость платформы, почему использована модель SaaS, как и чем обеспечивается безопасность и автоматизация. Что еще есть в этом FAQ: немного о персонализации и создании отчетов.

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




                              Аналитические обзоры


                              ServiceNow — лучшее решение ITSM в 2017 году по мнению Gartner. Расскажем, что позволило ServiceNow заслужить титул лучшей платформы для управления ИТ-процессами. Помимо этого — говорим об амбициозных планах на будущее и разбираемся с тем, какие технологии компания будет развивать в дальнейшем.

                              «На полпути»: Пятерка главных новостей компании ServiceNow за 2017 год. Из этой статьи вы узнаете подробности о таких событиях как: новый релиз Jakarta, покупка стартапа DxContinuum, сотрудничество с IBM и MapAnything, проекте Qlue и системах ИИ в ServiceNow.

                              ServiceNow Jakarta: обзор новых возможностей. Знакомимся с июльским релизом платформы на практике. В формате, который немного напоминает tutorial, мы прошлись по новому функционалу и рассказали о том, на какие моменты стоит обратить внимание.

                              ServiceNow Jakarta: для бизнеса. В этом аналитическом обзоре мы сделали акцент на управленческую составляющую. Как обычно — в формате ознакомительного tutorial'а.

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

                              Практические материалы


                              Далее мы приведем видеогайд от Ивана Жигалова, директора компании ИТ Гильдия. Он расскажет об управлении проектами на платформе ServiceNow. Речь пойдет о распределении ролей, карточке и консоли проекта, планировании спринта, отчетах и особенностях управления ресурсами.




                              Как создать и начать использовать каталог услуг (Service Catalog). Статья затрагивает проблемы ограниченного и неструктурированного доступа к ИТ-услугам компании. Чтобы помочь вам навсегда забыть о путанице, мы рассматриваем шаблоны описания услуг, поддержку каталога услуг в актуальном состоянии и работу с мнением сотрудников вашей компании.

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

                              Financial Management: Как оценить затраты на предоставляемые услуги. Затраты на обеспечение ИТ-систем в любой организации занимают отдельные статьи бюджета, но путаница в их структуре препятствует четкому пониманию их воздействия на достижение целей компании. Разберемся в механизмах управления финансами, планировании бюджета и рассмотрим два варианта расчета затрат. Все это на примере набора инструментов ServiceNow.

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





                              Немного о человеческих ресурсах и опыте успешных компаний


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

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

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

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

                              Что еще почитать по теме


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

                              Знакомство с ServiceNow и управлением ИТ-инфраструктурой: Дайджест #2. Наш второй дайджест продолжает логику первого — мы стараемся дать практические материалы и не забывать о теории. Здесь вы найдете статьи об управлении инфраструктурой и разработкой, вместе с этим — разберетесь со стандартами и мифами, которые окружают тему управления услугами.

                              «Горшочек, вари»: 50 инструментов для управления разработкой. Мы постарались собрать максимум полезных материалов, чтобы немного разгрузить разработчиков от повседневной рутины. Здесь мы сделали ставку на системы автоматизации, инструменты для управления проектами, прототипирования и тестирования.
                              Original source: habrahabr.ru (comments, light).

                              https://habrahabr.ru/post/338236/


                              Метки:  

                              [Из песочницы] learnopengl. Урок 2.6 — Несколько источников освещения

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

                              learnopengl. Урок 2.6 — Несколько источников освещения

                              OGL3

                              Несколько источников освещения


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

                              В предыдущих сериях

                              Часть 1. Начало

                              1. OpenGL
                              2. Создание окна
                              3. Hello Window
                              4. Hello Triangle
                              5. Shaders
                              6. Текстуры
                              7. Трансформации
                              8. Системы координат
                              9. Камера

                              Часть 2. Базовое освещение

                              1. Цвета
                              2. Основы освещения
                              3. Материалы
                              4. Текстурные карты
                              5. Источники света

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

                              Функции в GLSL такие-же как и функции в языке C. У нас есть имя функции, возвращаемый тип и также мы можем объявить её прототип сверху, а описать её снизу. Мы создадим разные функции для каждого типа освещения: направленного источника освещения, точечного источника и прожектора.

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

                              out vec4 FragColor;

                              void main()
                              {
                              // устанавливаем значение нашего выходного цвета
                              vec3 output = vec3(0.0);
                              // добавляем значение, полученное из направленного источника освещения
                              output += someFunctionToCalculateDirectionalLight();
                              // делаем тоже самое и с точечным источником
                              for(int i = 0; i < nr_of_point_lights; i++)
                              output += someFunctionToCalculatePointLight();
                              // и добавляем остальные значения так же
                              output += someFunctionToCalculateSpotLight();

                              FragColor = vec4(output, 1.0);
                              }


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

                              Направленный источник освещения


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

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

                              struct DirLight {
                              vec3 direction;

                              vec3 ambient;
                              vec3 diffuse;
                              vec3 specular;
                              };
                              uniform DirLight dirLight;


                              Мы можем передать наш объект dirLight в функцию со следующим прототипом:

                              vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir);

                              Также как в C и C++, если мы хотим вызвать функцию (в нашем случае внутри функции main) функция должна быть объявлена где-нибудь до того момента, где мы её вызываем. В нашем случае, мы объявим прототип над функцией main, а опишем её где нибудь ниже.
                              Вы можете видеть, что функция требует DirLight структуру и 2 вектора. Если вы успешно завершили предыдущие уроки, тогда код этой функции не должен вызывать для вас вопросов:

                              vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir)
                              {
                              vec3 lightDir = normalize(-light.direction);
                              // диффузное освещение
                              float diff = max(dot(normal, lightDir), 0.0);
                              // освещение зеркальных бликов
                              vec3 reflectDir = reflect(-lightDir, normal);
                              float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
                              // комбинируем результаты
                              vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
                              vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
                              vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
                              return (ambient + diffuse + specular);
                              }


                              Пользуясь примером кода с предыдущего урока и используя вектора, которые принимает функция в качестве аргументов, вычисляем результат каждого компонента (ambient, diffuse и specular). Затем суммируем наши компоненты и получаем конечный цвет фрагмента.

                              Точечные источники освещения


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

                              struct PointLight {
                              vec3 position;

                              float constant;
                              float linear;
                              float quadratic;

                              vec3 ambient;
                              vec3 diffuse;
                              vec3 specular;
                              };
                              #define NR_POINT_LIGHTS 4
                              uniform PointLight pointLights[NR_POINT_LIGHTS];


                              Как вы можете видеть мы использовали препроцессор GLSL, что-бы объявить число точечных источников NR_POINT_LIGHTS равное 4. Мы используем эту константу NR_POINT_LIGHTS, чтобы создать объект массив структуры PointLight. Массивы в GLSL такие же как и массивы в C и
                              могут быть созданы с использованием двух квадратных скобок. Прямо сейчас у нас есть 4 объекта pointLights[NR_POINT_LIGHTS] структуры PointLigh.
                              Мы могли также создать одну большую структуру, которая включала бы все нужные переменные для всех разных типов освещения, и использовали бы её для каждой функции, игнорируя переменные в которых бы мы не нуждались. Хотя, я лично нахожу нынешний подход более лучшим, т.к. не всем типам освещения будут нужны все переменные.
                              Прототип функции точечного источника:

                              vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir);

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

                              vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir)
                              {
                              vec3 lightDir = normalize(light.position - fragPos);
                              // диффузное освещение
                              float diff = max(dot(normal, lightDir), 0.0);
                              // освещение зеркальных бликов
                              vec3 reflectDir = reflect(-lightDir, normal);
                              float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
                              // затухание
                              float distance = length(light.position - fragPos);
                              float attenuation = 1.0 / (light.constant + light.linear * distance +
                              light.quadratic * (distance * distance));
                              // комбинируем результаты
                              vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
                              vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
                              vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
                              ambient *= attenuation;
                              diffuse *= attenuation;
                              specular *= attenuation;
                              return (ambient + diffuse + specular);
                              }


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

                              Объединяем всё вместе


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

                              void main()
                              {
                              // свойства
                              vec3 norm = normalize(Normal);
                              vec3 viewDir = normalize(viewPos - FragPos);

                              // фаза 1: Направленный источник освещения
                              vec3 result = CalcDirLight(dirLight, norm, viewDir);
                              // фаза 2: Точечные источники
                              for(int i = 0; i < NR_POINT_LIGHTS; i++)
                              result += CalcPointLight(pointLights[i], norm, FragPos, viewDir);
                              // фаза 3: фонарик
                              //result += CalcSpotLight(spotLight, norm, FragPos, viewDir);

                              FragColor = vec4(result, 1.0);
                              }


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

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

                              Удачно для нас, что это не слишком сложно. Чтобы задать значение конкретному объекту uniform массива, нужно лишь обратиться к этому объекту, как к обычному массиву (через индекс).

                              lightingShader.setFloat("pointLights[0].constant", 1.0f);

                              Здесь мы обращаемся к 1 элементу нашего массива pointLights и устанавливаем значение 1.0f переменной constant. К сожалению это значит, что мы должны таким-же способом установить все переменные, всем элементам массива, что в итоге приведет к 28 строка кода. Вы можете попытаться, написать боле удобный код для этой задачи.

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

                              glm::vec3 pointLightPositions[] = {
                              glm::vec3( 0.7f, 0.2f, 2.0f),
                              glm::vec3( 2.3f, -3.3f, -4.0f),
                              glm::vec3(-4.0f, 2.0f, -12.0f),
                              glm::vec3( 0.0f, 0.0f, -3.0f)
                              };


                              Далее, мы просто проиндексируемся по этому массиву и установим значения position для каждого объекта массива pointLight. Также, нам нужно нарисовать 4 световых куба, вместо 1. Простой способ сделать это, передавать разные значения матрицы модели, используя наш только что созданный массив pointLightPositions.

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

                              image

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

                              Вы можете найти полный код здесь.

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

                              image

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

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

                              Задания


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

                              -> Оригинал статьи
                              Original source: habrahabr.ru (comments, light).

                              https://habrahabr.ru/post/338254/


                              Метки:  

                              Поиск сообщений в rss_rss_hh_full
                              Страницы: 1824 ... 1539 1538 [1537] 1536 1535 ..
                              .. 1 Календарь