...

суббота, 17 августа 2019 г.

[Из песочницы] История создания Ethernet-CAN конвертера

Одним ясным солнечным днем по работе понадобился недорогой преобразователь интерфейсов CAN в Ethernet. Естественно поиски начались с готовых решений, но, как нередко это бывает, в итоге было принято решение о разработке собственного образца. Естественно, энтузиазм автора не смог устоять и ограничиться столь «урезанным» функционалом. Что из этого вышло, каким образом и почему — под катом.

image
Общая сводка. На фото выше представлена 3D модель разработанной мной платы при помощи САПР Altium Designer. Основные характеристики и функционал:

  • 10\100 Mb Ethernet
  • RTC
  • MicroSD (FAT12, FAT16, FAT32) 4GB
  • RS232 \ RS485
  • CAN
  • Buzzer
  • 3 User LED
  • GPIO
  • 32 KB EEPROM
  • 2MB FLASH
  • I2C
  • SPI
  • UART
  • SW \ JTAG
  • USB serial (COM Port)
  • Power: miniUSB 5V \ External 9..24V

Стоимость собранной платы ~ 5000 Р. За исходниками можно обращаться в личку или на почту, проект носит open source характер. То, что получилось в итоге, помимо основного функционала, можно считать неплохой отладочной платой для работы с микроконтроллером STM32.

А теперь к подробностям создания.

Hardware


Изучение данной задачи началось с поиска и оценки готовых решений. Основными требованиями были:
  1. преобразование поступающих CAN2.0B фреймов в TCP\IP пакеты и наоборот;
  2. невысокая стоимость, как следствие реализация устройства на базе микроконтроллера.

У коллег из Китая есть несколько промышленных решений, но не из дешевых, поэтому в наш офис на тест был доставлен представитель отечественного производства «Преобразователь интерфейсов ПИРС CAN-Ethernet». По описанным возможностям и характеристикам устройство удовлетворяло скромное Т.З., оставалось лишь проверить работоспособность на деле, чем я и занялся, вооружившись Wireshark’ом и осциллографом. По неизвестной причине при отправке в девайс TCP пакетов на выходе устройства, там, где должны были появляться CAN фреймы, выплёвывались последовательности с физическими уровнями CAN (диф. пара), но логическим протоколом интерфейса UART (со стартовыми и стоповыми битами). Вскрыв корпус, открыв документацию микросхем и прозвонив дорожки платы, обнаружилось, что, действительно, пины RX и TX (UART) микроконтроллера соединены с трансивером CAN и с него выведены на внешний разъем. Таким образом, никакой аппаратной поддержки стандарта CAN2.0B ожидать не приходилось.

Вот, что я увидел на выводе CANL «ПИРС CAN-Ethernet» при отправке двух байт данных [0xF0] и [0x0A] по TCP\IP:

image

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

А вот как должен был выглядеть «истинный» CAN2.0B фрейм с теми же двумя байтами данных:

image

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

Спойлер
image

Первые 4 байта – идентификатор фрейма. Подробнее о формате CAN можно узнать из [1]


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

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

3. Возможность питания от 12-24 В в транспортных системах;
4. Наличие внешней памяти для хранения логов;
5. Размеры платы не более 86х80мм.
6. Рабочий диапазон температур -40..85 °С

В качестве мозга нового устройства была выбрана небезызвестная платформа STM32F407VET6 [2], обладающая аппаратной поддержкой всех необходимых интерфейсов и неплохим запасом RAM и FLASH памяти. Пошерстив интернет, в качестве PHY Ethernet был выбран трансивер DP83848IVV [3], имеющий хорошую, на мой взгляд, документацию и достаточно примеров схем с подключением и трассировкой. В качестве внешней энергонезависимой памяти для хранения логов я выбрал SPI FLASH 2 MB и SPI EEPROM для хранения разнообразных настроек. Кроме того была добавлена защита питания от перенапряжения, переполюсовки. Через N вечеров и M выходных были составлены принципиальная схема и трассировка печатной платы устройства первой версии. Т.к. места на плате было достаточно, а незадействованные ножки МК оставлять не хотелось, помимо основного функционала на плату были добавлены:

  • средства для отладки SW, JTAG;
  • переключатель 8-DIP Switch;
  • micro-USB (USB Serial);
  • RS-232;
  • UART;
  • I2C;
  • GPIO

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

image
Первая версия PCB-дизайна

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

image

При помощи STM32CubeMX я набросал тестовую прошивку с проверкой работоспособности основных периферийный модулей устройства и, в первом приближении, заработало все, кроме запуска МК от внешнего кварца 8 МГц. Оказалось, из-за моей ошибки в составлении спецификации, были напаяны не те нагрузочные конденсаторы. Но это не помешало STM32F407 работать от внутреннего RC-генератора. Когда же я смог пропинговать свое устройство, радости было не сдержать т.к. с трассировкой PHY Ethernet я провозился, наверное, дольше всего. Затем в браузере я увидел свою тестовую http страницу и с тестированием успокоился.

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

К тому времени, на работе, в закромах нашлась железка способная решить поставленную задачу конвертации в текущем проекте, но, помимо крупных габаритов и стоимости, сев писать для нее прошивку, я столкнулся с проблемами связанными с объемом RAM и урезанным функционалом TCP\IP стека МК LPC2368. Так что желание сделать свое устройство только усиливалось.
Внимательно изучив недостатки первой версии, я, долго не думая, приступил ко второй. И снова захотелось добавить «задел на будущее», вместив в прежний форм-фактор следующие компоненты:

  • поддержка RTC с батарейкой;
  • RS-485;
  • micro-SD;
  • пищалка buzzer;
  • возможность питания от USB;
  • SPI на внешний разъем;
  • питание 5V и 3.3V на внешний разъем.

Кроме прочего была добавлена защита питания по току и TVS диоды на пользовательские разъемы.

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

image

image
Вторая версия платы

Ко второй версии я разобрался с 3D моделированием в Altium Designer, что очень помогло в избежании ошибок взаимного расположения компонентов по двум сторонам (оказалось, в интернете уже полно готовых моделек SMD компонентов [4]). Тем самым, все ошибки первой версии были исправлены, нововведения показали свою работоспособность, что очень меня порадовало.

Firmware


Описание кода выходит за рамки данной части, однако пару слов о программной составляющей сказать хочется. В своем устройстве я решил использовать связку FreeRTOS + LwIP стек. Статей про них в достаточном количестве, например, [5] и [6], поэтому прикрутить их к своему проекту не должно составить трудностей. Вкратце, LwIP – TCP\IP стек для встраиваемых систем, характеризующийся малым потреблением RAM и удобным API (есть даже BCD socket оболочка). Я использовал netconn API. Средствами FreeRTOS, вся работа TCP\IP стека помещается в поток отдельный от приложения. Помимо основной работы (соединение внешнего TCP-сервера с CAN шиной) в самостоятельном потоке крутится отдельный веб-сервер для доступа к настройкам устройства. Такой веб-интерфейс предназначен для мониторинга и конфигурации настроек устройства – установки разных режимов работы, скоростей передачи, адресов и т.д. Пока не знаю получится ли сделать и обновление прошивки через него.

Заключение


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

Используемые источники


1. Wikipedia/Controller_Area_Network
2. STM32F407VET6 datasheet
3. DP83848 datasheet
4. 3D Models
5. Введение в FreeRTOS
6. Введение в LwIP

Let's block ads! (Why?)

Создан электросамокат с функцией возврата на зарядную станцию

Компания Segway-Ninebot Group провела презентацию своего нового устройства — электрического трехколесного самоката, который оснащен специальной системой самостоятельного возвращения на зарядную станцию. Эта опция может сделать данную разработку востребованным в большом количестве сервисов проката электросамокатов.
По сообщению издания Reuters необычной трехколесной новинкой от Segway-Ninebot Group уже заинтересовались в компаниях Uber и Lyft, расширяющих свою деятельность и планирующих выйти на глобальный рынок проката электросамокатов.


«Беда для операторов электросамокатов заключалась в том, что нет возможности в автоматическом режиме их обслуживать и заряжать, снижая при этом свои затраты», – сказал Гао Луфэн, председатель и исполнительный директор Ninebot по данных издания Nasdaq.

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

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

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

Стоимость новинки на этапе предзаказа и первых продаж оценивается в 10 тысяч юаней (примерно 1 420 долларов США\90 000 рублей) за одну единицу.

Это очень высокая цена для такого устройства, обычно сервисы аренды закупают оптом электросамокаты по 200-300 долларов США за штуку.

Ожидается, что трехколесные самокаты от Segway-Ninebot Group должны появиться в продаже в начале 2020 года.

Новый электросамокат, согласно данным издания Frandroid получил название KickScooter T60.

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

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

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

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

Let's block ads! (Why?)

Криптографический АРМ на базе токенов PKCS#11. Получение сертификатов для ЕГАИС. Часть 4

И вот, когда я уже практически добавил в криптографический АРМ на базе токенов PKCS#11 cryptoarmpkcs генерацию самоподписанных сертификатов и готов был приступить к написанию статьи, мне пришло такое письмо:
Мы являемся УЦ «Имярек», у нас возникло затруднение с выпуском ЭП в формате pkcs#11 для ЕГАИС, портал не понимает ЭП в формате «Имярек» CSP, просим Вас помочь в данной проблеме.
.
Я еще не знал всех тонкостей работы с ЕГАИС, но поскольку речь шла о PKCS#11, то предложил воспользоваться утилитой cryptoarmpkcs для генерации запроса и установки сертификата на токен после его получения из УЦ. Полученный ответ меня несколько огорошил:
Увы нет, дело обстоит в том, что мы на RuToken 2.0 записали ЭП через КриптоПро CSP, но при всех должных настройках портал ЕГАИС не увидел на ключевом носителе ЭП, клиент обратился к нам в поддержку и мы установили, что проблема в том что не в том формате записан сертификат на ключ, вот мануал dev.rutoken.ru/display/KB/RU1051
.
Я (и не только я) уже неоднократно писал, что многие используют криптографические токена с поддержкой российской криптографии как обыкновенные флэшки. И это как раз был тот случай, когда ключ и сертификат попали на токен не как объекты PKCS#11. Обидно было то, что они не воспользовались советом и даже не попытались создать запрос. Но тут я решил все отложить в сторону и разобраться как и на чем выпускаются сертификаты для ЕГАИС Росалкогольрегулирование. И рассматривать мы будем только криптографические токены PKCS#11. Самое большое разочарование — это доступ к ЕГАИС только через ОС Windows и браузер IE. С другой стороны, генерацию запроса на сертификат и установку сертификата всеже можно проводить под любой ОС, если для нее имеются драйвера/библиотеки для соответствующего токена.
По крайней мере токены PKCS#11 JaCarta, RutokenECP-2.0, программный токен LS11SW2016 и даже облачный токен имеют поддержку и на MS Windows, и на Linux, и на OS X. И не только на этих ОС.
Воообще-то, надо отдать должное разработчикам ЕГАИС. Они предложили интересную технологию, которая позволяет для доступа использовать личные сертификаты (сертификат плюс ключевая пара), хранящиеся на криптографических токенах с поддержкой российской криптографии, а канал защищать на RSA-сертификатах. Хотя если сказали А, то можно было сказать и В, т.е. защищать канал на ГОСТ-овых алгоритмах. Огорчает одно, что все это заточено только под MS Windows (или я ошибаюсь?), а точнее под Internet Explorer. А утилиты генерации запросов на сертификат для ЕГАИС привязаны к тому или иному токену.
Но утилита cryptoarmpkcs мультиплатформенная. Более того, она способна работать с любым криптографичеким токеном PKCS#11, поддерживающим российскую криптографию.
Итак, в чем же особенность запроса на сертификат для ЕГАИС? Основная особенность, — это обязательное наличие в отличительном имени владельца сертификата (DN subject) дополнительного поля unstucturedName (UN) (oid — 1.2.840.113549.1.9.2). Если владельцем сертификата будет индивидуальный предприниматель, то в это поле записывыется строка «КПП=», а если владелец юридическое лицо, то в это поле записывается строка следующего вида:
КПП=код_причины_постановки_на_налоговый_учет:

В связи с этим требование на первой странице вкладки запрос на сертификат была добавлена кнопка ЕГАИС:

Еще одна особенность заключается в том, что обладатели сертификатов для ЕГАИС могут быть лицензиатами системы декларирования ФСРАР (oid — 1.2.643.3.6.78.4.4). Это тоже необходимо учитывать при создании запроса:

После того как все поля запроса на сертификат заполнены и вы подтвердили правильность данных, будут сгенерирована ключевая пара и создан запрос:

Если просмотреть запрос, то в нем можно увидеть oid-ы (Extetnded Key Usage — Расширенное Использование Ключа), которые требуются для ЕГАИС Росалкогольрегулирование:

Здесь следует обратить внимание (на предыдущем скриншоте) на метку ключевой пары. В терминологии PKCS#11 это атрибут CKA_LABEL для открытого и закрытого ключа. Именно по такой схема создается метка (имя ключа) генератором запросов ЕГАИС для JaCarta от ФГУП «ЦентрИнформ»:

Традиционно тройка сертификат х открытый_ключ х закрытый ключ
на токене связывается через атрибут CKA_ID
:

Наиболее распространенный способ задания CKA_ID – это использование значения хэш-функции от значения открытого ключа. Именно такой способ для связывания тройки объектов используется в проекте NSS (Network Security Services). При этом в качестве хэш-функции используется алгоритм SHA1.

К сожалению, и CKA_LABEL и CKA_ID можно установить/изменить в любой момент с любым значением. Таким образом, всегда существует вероятность, что сертификат окажется связанным с чужим приватным ключом. Не нужно объяснять, к каким это приведет последствиям.
А вообще, существует ли строгий математический алгоритм, который позволяет связать тройку CKO_CERTIFICATE x CKO_PRIVATE_KEY x CKO_PUBLIC_KEY в единое целое?
Да, такой алгоритм на базе криптографических механизмов (CKM_) токена существует.
К сожалению (хотя объективно понять можно), рассматривает связку в тройке через CKA_LABEL, формируемую выше упомянутым способом. Более того и для закрытого и открытого ключей СКА_ID формируется аналогичным образом. Для ключей это просто катастрофа, т.к. как ни CKA_ID ни CKA_LABEL никак не привязаны к самому ключу. Это касается и сертификата после его установки на токен. Если при традиционном формировании CKA_ID как хэш от открытого ключа, можно вегда проверить соответствие одного другому, то при задании CKA_ID и CKA_LABEL описанным выше способом это сделать невозможно.
Может возникнуть вопрос, а как проверить соответствие для закрытого ключа? Ответ простой, — вычислив значение открытого ключа по закрытому. Что касается сертификата, то значение его открытого ключа находится, естественно, в нем. Более того, сертификат сам содержит значение CKA_ID как для владельца сертификата (Certificate Subject Key Identifier), так и для издателя сертификата (Certificate Authority Key Identifier):

Самое неприятное оказалось, что при установке сертификата проверяется не наличие закрытого ключа, а достаточно наличия только открытого ключа. В этом случае сертификат установится, но закрытого ключа на нем не будет. Еще одна проблема. Это поиск открытого ключа по ИНН. Представляете, у человека один ИНН и несколько ключей для различных сертификатов. Какой кому принадлежит? После этого становится понятным требование наличия на JaCarta только одного сертификата и одной ключевой пары:

Данная ошибка может быть связана с задвоением сертификата. В Едином клиенте JaCarta в режиме администратора на вкладке ГОСТ После ввода пин-кода должен быть виден один открытый, один закрытый ключ и сертификат. В данном случае видно задвоение ключей. Вам нужно удалить лишние. Заново вставить носитель в usb разъем и повторите попытку установки УТМ. Если ошибка не исчезла, проведите инициализацию Jacarta по инструкции ссылка 1 и заново пройдите процесс генерации.

Будем надеяться, что этот недостаток будет устранен. Вы можете спросить, а как устанавливает сертификат утилита cryptoarmpkcs для ЕГАИС. Для полной совместимости для JaCarta мы сохранили идеологии, что CKA_ID и CKA_LABEL для ключей совпадают. Но только после установки сертификата на токен и его привязке в ключевой паре. А до этого момента CKA_ID ключевой пары сохраняется равным значению хэш от открытого ключа.
После установки сертификата его можно использовать для подписания документов.
Теперь осталось всеже завершить доработку по созданию самоподписанных сертификатов и утилита cryptoarmpkcs и вместе с ней эта серия статей будет завершена:

image

Дистрибутивы лежат на прежнем месте.

Let's block ads! (Why?)

FAQ по HeadHunter API (публикация вакансий)

Небольшая история про наш рекрутинговый сервис под заказчика и большая история про проблемы, которые появились при интеграции с HeadHunter с точки зрения публикации вакансий. Почему HeadHunter? Потому что на Superjob всё несколько проще (но это не точно).

image


Предыстория

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


  1. бизнес утверждает базовые шаблоны вакансий (требования, обязанности, условия), универсальные для всех магазинов и городов;
  2. HRы на основе базового шаблона создают основной шаблон вакансии под каждый город, указывая диапазон зарплаты для конкретной должности (для одинаковых должностей в разных регионах могут быть разные зарплаты);
  3. директор магазина на основе шаблона вакансии открывает вакансию на свой магазин внутри нашего приложения и получает на неё ссылку;
  4. кандидат, переходя по ссылке, попадает на анкету, куда вносит контактную информацию и отправляет на рассмотрение директору магазина;
  5. ??????
  6. PROFIT!

Когда появилось предложение публиковать вакансию на HeadHunter со ссылкой на анкету, я бегло изучил документацию к их API и подумал что-то в стиле "там делов на 5 минут". И вот, спустя ~1.5 месяца, пишу данную статью.

Итак, есть задача по публикации вакансий на HeadHunter, вам понадобятся:


Актуальная версия API

К сожалению (или к счастью?), API не версионирован, поэтому, теоретически, в любой момент может отвалиться что угодно. Даже если такого никогда не случалось и к этому нет предпосылок, всё равно он обновляется:


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

Регистрация приложения

Здесь всё просто, но не так просто, как хотелось бы. Будет предложено заполнить форму, где одно из полей содержит формулировку "Опишите все функциональные возможности приложения и укажите используемые методы API". Насколько подробно???

все методы?

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

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


Регистрация второго приложения

Обратите внимание на параметр Redirect URI при регистрации приложения. Согласно нашему наблюдению, подтверждённому техподдержкой HeadHunter, если ваш тестовый контур находится на субдомене (допустим, test.example.com), то нужно приложение для прода (с redirect_uri=example.com) и для разработки (с redirect_uri=test.example.com). А это ещё две недели ожидания одобрения.


Изучение и уточнение правил

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


Немного интуиции

Иногда тексты ошибок абсолютно непредсказуемы и нелогичны. Вот с чем мы столкнулись:


  • not_enough_purchased_services (купленных услуг для публикации или обновления данного типа вакансии не достаточно) — при публикации вакансии с типом free. Что именно нужно купить для бесплатных вакансий — не понятно. Решение: указать type: standard;
  • quota_exceeded (квота менеджера на публикацию данного типа вакансии закончилась) — возникает при неправильной настройке разрешений менеджеров (об этом чуть позже), последний же раз мы её видели при опечатке standart вместо standard в поле type;
  • duplicate (аналогичная вакансия уже опубликована) при использовании флага ignore_duplicates — возникает при совпадающих полях name и area, независимо от наличия флага игнорирования дубликатов.

А также


Про безопасность

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


Про интерфейсы

Описание вакансии — это одно поле description, поддерживающее несколько HTML-тегов, которые можно подсмотреть в их визуальном редакторе на сайте. Мы выбрали формат вакансии из трёх текстовых полей: обязанности, требования, условия и для HeadHunter просто объединяем их, вставляя h3 с названием поля в качестве разделителя.


Про quota_exceeded

Со стороны это выглядело так, словно аккаунт, связанный с API, выступает мастер-аккаунтом и остальные менеджеры должны от него наследоваться через интерфейс сайта. Пока один из менеджеров не был привязан, возвращалась ошибка quota_exceeded для его аккаунта. Точно разобраться как это работает не было возможности, если вы знаете — сообщайте!


Про справочники

Как и весь API, справочники могут измениться в любой момент, о чём явно сказано в их описаниях:
справочник

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



"Быстрый старт" займёт у вас около двух недель, вероятно, с необходимостью регистрировать несколько приложений. В целом, документация и сам API достаточно вменяемы, в остальном можно разобраться по общению с техподдержкой или через issue на их гитхабе.

Уверен, мы нашли не все интересности, связанные с API HeadHunter, ведь даже не касались ветки резюме. Поэтому, если вам есть что рассказать / дополнить / уточнить — пишите в комментарии.

Let's block ads! (Why?)

[Из песочницы] Установка OpenCV + CUDA на Windows

Введение


В данной статье речь пойдет о сборке и установке OpenCV 4 из исходных файлов с дополнительными модулями CUDA 10 на ОС Windows.

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

Сборка тестировалась для:

  • Windows 8.1 + Visual Studio 2017 + Python 2/3 + CUDA 10.0 + GeForce 840m
  • Windows 10 + Visual Studio 2019 + Python 2/3 + CUDA 10.0 + GeForce GTX 1060

Внимание! Сборка не подойдет для версии OpenCV 4.0.1 и/или CUDA ниже 10-й версии. CUDA 9 и ниже поддерживается OpenCV 3.

Что потребуется для установки


В моей сборке использовались следующие инструменты:
  1. CMake 3.15
  2. MS Visual Studio 2019 64-бит + средства CMake С++ для Windows
  3. Python 3.7.3 64-бит + NumPy 64-бит
  4. Python 2.7.16 64-бит + NumPy 64-бит
  5. CUDA 10.0
  6. CuDNN 7.6.2
  7. OpenCV 4.1.1 и OpenCV-contrib-4.1.1

Установка


Так как установка производится через консольные команды, то следует внимательно и аккуратно выполнять все шаги. Также, при необходимости, меняйте установочные пути на свои.
Для начала необходимо установить требуемое ПО, причем Visual Studio должна быть установлена до CUDA:
После установки всех компонент убедитесь, что пути для CMake, Visual Studio, Python, CUDA, CuDNN прописаны в переменных PATH, PYTHONPATH, CUDA_PATH и cudnn соответственно.

Далее загружаем архивы исходников opencv-4.1.1 и opencv-contrib-4.1.1 в желаемое место (в моем случае это C:\OpenCV\).

git clone https://github.com/opencv/opencv.git -b "4.1.1"
git clone https://github.com/opencv/opencv_contrib.git -b "4.1.1"

Создаем папку build/ внутри opencv-4.1.1.

Далее сгенерируем файлы сборки с помощью cmake. Мы будем использовать консольный вариант cmake, так как cmake-gui путает типы некоторых переменных (например, OPENCV_PYTHON3_VERSION) и, как следствие, неправильно генерирует файлы.

Открываем консоль по пути C:\OpenCV\ и прописываем переменные.

set "opencvSource=opencv-4.1.1"
set "opencvExtraModules=opencv_contrib-4.1.1/modules"
set "opencvBuild=%opencvSource%\build"
set "compiler=Visual Studio 16 2019"
set "buildType=Release"

Примечание. Для Visual Studio 2017 генератор пишется как «Visual Studio 15 2017 Win64» и без флага -A.

Также можно явно указать питоновские библиотеки для python 2 и python 3 на случай, если сборщик не сможет найти их автоматически.

set "python2_executable=C:/Python27/python.exe"
set "python2_include_dir=C:/Python27/include"
set "python2_library=C:/Python27/libs/python27.lib"
set "python2_numpy_include_dirs=C:/Python27/Lib/site-packages/numpy/core/include"
set "python2_packages_path=C:/Python27/Lib/site-packages"

set "python3_executable=C:/Users/root/Anaconda3/python.exe"
set "python3_include_dir=C:/Users/root/Anaconda3/include"
set "python3_library=C:/Users/root/Anaconda3/libs/python37.lib"
set "python3_numpy_include_dirs=C:/Users/root/Anaconda3/lib/site-packages/numpy/core/include"
set "python3_packages_path=C:/Users/root/Anaconda3/Lib/site-packages"

Примечание. Обратите внимание на то, что библиотека NumPy должна быть той же разрядности, что и OpenCV. Проверить это легко:
import numpy.distutils.system_info as sysinfo
print(sysinfo.platform_bits)

Выполняем генерацию файлов сборки с помощью длинной команды ниже. При неудачной генерации или наличии ошибок после выполнения команды, повторную генерацию следует производить вычистив все файлы в build/ и .cache/.
cmake ^
-B"%opencvBuild%/" ^
-H"%opencvSource%/" ^
-G"%compiler%" ^
-Ax64 ^
-DCMAKE_BUILD_TYPE=%buildType% ^
-DBUILD_opencv_world=ON ^
-DINSTALL_TESTS=OFF ^
-DINSTALL_C_EXAMPLES=OFF ^
-DBUILD_EXAMPLES=OFF ^
-DOPENCV_EXTRA_MODULES_PATH="%opencvExtraModules%/" ^
-DBUILD_PROTOBUF=ON ^
-DBUILD_opencv_python_bindings_generator=ON ^
-DWITH_CUDA=ON ^
-DCUDA_FAST_MATH=ON ^
-DWITH_CUBLAS=ON ^
-DCUDA_ARCH_PTX=7.5 ^
-DBUILD_opencv_python2=ON ^
-DPYTHON2_EXECUTABLE="%python2_executable%" ^
-DOPENCV_PYTHON2_VERSION=2.7.16 ^
-DPYTHON2_INCLUDE_DIR="%python2_include_dir%" ^
-DPYTHON2_LIBRARY="%python2_library%" ^
-DPYTHON2_NUMPY_INCLUDE_DIRS="%python2_numpy_include_dirs%" ^
-DPYTHON2_PACKAGES_PATH="%python2_packages_path%" ^
-DBUILD_opencv_python3=ON ^
-DPYTHON3_EXECUTABLE="%python3_executable%" ^
-DOPENCV_PYTHON3_VERSION=3.7.3 ^
-DPYTHON3_INCLUDE_DIR="%python3_include_dir%" ^
-DPYTHON3_LIBRARY="%python3_library%" ^
-DPYTHON3_NUMPY_INCLUDE_DIRS="%python3_numpy_include_dirs%" ^
-DPYTHON3_PACKAGES_PATH="%python3_packages_path%"

Значение некоторых флагов
  • BUILD_opencv_world – необязательный модуль, содержащий копии всех выбранных в ходе установки библиотек. Удобен при разработке на C++, так как вместо подключения кучи зависимостей opencv можно подключить одну зависимость opencv_world411.lib в проект
  • INSTALL_EXAMPLES/INSTALL_TESTS – установка примеров/тестов кода opencv
  • CUDA_FAST_MATH, WITH_CUBLAS – дополнительные модули для CUDA, призванные ускорить вычисления
  • CUDA_ARCH_PTX – версия PTX инструкций для улучшения производительности вычислений


Спустя примерно 10 минут в консоле должна появиться информация о сборке и завершающие строки «Configuring done» и «Generating done». Проверяем всю информацию, особенно разделы NVIDIA CUDA, Python 2, Python 3.

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

cmake --build %opencvBuild% --target ALL_BUILD --config Release

Устанавливаем решение.
cmake --build %opencvBuild% --target INSTALL --config Release

После успешной установки создаем системную переменную OPENCV_DIR со значением C:\OpenCV\opencv-4.1.1\build\install\x64\vc15\bin и также добавляем ее в PATH.

Тест


Проверим работоспособность OpenCV с модулем CUDA на простом примере умножения матриц.
Подключение OpenCV в проект Visual Studio
  1. Установить тип сборки Release/x64 (для Debug следует собрать OpenCV с флагом Debug)
  2. Project Properties → C/C++ → General → Добавить строку «C:\OpenCV\opencv-4.1.1\build\install\include» в Additional Include Directories
  3. Project Properties → Linker → General → Добавить строку « C:\OpenCV\opencv-4.1.1\build\install\x64\vc16\lib» в Additional Library Directories
  4. Project Properties → Linker → General → Добавить «;opencv_world411.lib» («;opencv_world411d.lib» для Debug) в конец Additional Dependencies


Пример на Python 3
import numpy as np
import cv2 as cv
import time

rand = np.random.random((1024, 1024)).astype(np.float32)
h_array1 = np.stack([rand, rand],axis=2)
h_array2 = h_array1
d_array1 = cv.cuda_GpuMat()
d_array2 = cv.cuda_GpuMat()
d_array1.upload(h_array1)
d_array2.upload(h_array2)

start = time.time()
cv.cuda.gemm(d_array1, d_array2, 1, None, 0, None, 1)
end = time.time()
print("Time elapsed:", end - start, "sec")

Вывод в консоли
Time elapsed: 0.3130002021789551

Пример на C++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudaarithm.hpp>

using namespace std;
using namespace cv;
using namespace cv::cuda;

int main() {

        Mat h_array1 = Mat::ones(1024, 1024, CV_32FC2);
        Mat h_array2 = Mat::ones(1024, 1024, CV_32FC2);
        Mat h_array3 = Mat::zeros(1024, 1024, CV_32FC2);
        Mat h_result;
        GpuMat d_array1, d_array2, d_array3, d_result;

        d_array1.upload(h_array1);
        d_array2.upload(h_array2);

        const clock_t begin_time = clock();
        cuda::gemm(d_array1, d_array2, 1.0, d_array3, 0.0, d_result);
        cout << "Time elapsed: " << (float(clock() - begin_time) / CLOCKS_PER_SEC) << " sec" << endl;

        d_result.download(h_result);

        return 0;

Вывод в консоли
Time elapsed: 0.354

Удаление


Чтобы удалить OpenCV, нужно выполнить команду.
cmake --build %opencvBuild% --target uninstall --config Release

и удалить системную переменную OPENCV_DIR и убрать путь до OpenCV из PATH.

Заключение


В статье мы рассмотрели установку OpenCV 4 для ОС Windows 10. Данный алгоритм тестировался на Windows 8.1 и Windows 10, но, в теории, может собираться и на Windows 7. За дополнительной информацией можно обратиться к списку источников ниже.

P.S. Напоследок сведем все установочные команды в один .bat файл для тех, кто хочет автоматизировать установку.

install_opencv411.bat
cd C:\OpenCV

git clone https://github.com/opencv/opencv_contrib.git -b "4.1.1"
git clone https://github.com/opencv/opencv.git -b "4.1.1"

ren opencv opencv-4.1.1
ren opencv_contrib-4.1.1

set "opencvSource=opencv-4.1.1"
set "opencvExtraModules=opencv_contrib-4.1.1/modules"
set "opencvBuild=%opencvSource%\build"
set "compiler=Visual Studio 16 2019"
set "buildType=Release"

set "python2_executable=C:/Python27/python.exe"
set "python2_include_dir=C:/Python27/include"
set "python2_library=C:/Python27/libs/python27.lib"
set "python2_numpy_include_dirs=C:/Python27/Lib/site-packages/numpy/core/include"
set "python2_packages_path=C:/Python27/Lib/site-packages"

set "python3_executable=C:/Users/root/Anaconda3/python.exe"
set "python3_include_dir=C:/Users/root/Anaconda3/include"
set "python3_library=C:/Users/root/Anaconda3/libs/python37.lib"
set "python3_numpy_include_dirs=C:/Users/root/Anaconda3/lib/site-packages/numpy/core/include"
set "python3_packages_path=C:/Users/root/Anaconda3/Lib/site-packages"

cmake ^
-B"%opencvBuild%/" ^
-H"%opencvSource%/" ^
-G"%compiler%" ^
-Ax64 ^
-DCMAKE_BUILD_TYPE=%buildType% ^
-DBUILD_opencv_world=ON ^
-DINSTALL_TESTS=OFF ^
-DINSTALL_C_EXAMPLES=OFF ^
-DBUILD_EXAMPLES=OFF ^
-DOPENCV_EXTRA_MODULES_PATH="%opencvExtraModules%/" ^
-DBUILD_PROTOBUF=ON ^
-DBUILD_opencv_python_bindings_generator=ON ^
-DWITH_CUDA=ON ^
-DCUDA_FAST_MATH=ON ^
-DWITH_CUBLAS=ON ^
-DCUDA_ARCH_PTX=7.5 ^
-DBUILD_opencv_python2=ON ^
-DPYTHON2_EXECUTABLE="%python2_executable%" ^
-DOPENCV_PYTHON2_VERSION=2.7.16 ^
-DPYTHON2_INCLUDE_DIR="%python2_include_dir%" ^
-DPYTHON2_LIBRARY="%python2_library%" ^
-DPYTHON2_NUMPY_INCLUDE_DIRS="%python2_numpy_include_dirs%" ^
-DPYTHON2_PACKAGES_PATH="%python2_packages_path%" ^
-DBUILD_opencv_python3=ON ^
-DPYTHON3_EXECUTABLE="%python3_executable%" ^
-DOPENCV_PYTHON3_VERSION=3.7.3 ^
-DPYTHON3_INCLUDE_DIR="%python3_include_dir%" ^
-DPYTHON3_LIBRARY="%python3_library%" ^
-DPYTHON3_NUMPY_INCLUDE_DIRS="%python3_numpy_include_dirs%" ^
-DPYTHON3_PACKAGES_PATH="%python3_packages_path%"

cmake --build %opencvBuild% --target ALL_BUILD --config Release
cmake --build %opencvBuild% --target INSTALL --config Release


Список источников


  1. docs.opencv.org/4.1.1/d3/d52/tutorial_windows_install.html
  2. www.learnopencv.com/install-opencv-4-on-windows
  3. jamesbowley.co.uk/build-opencv-4-0-0-with-cuda-10-0-and-intel-mkl-tbb-in-windows
  4. lightbuzz.com/opencv-cuda
  5. Глава «Building libraries from Source» книги Hands-on GPU-Accelerated Computer Vision with OpenCV and CUDA

Let's block ads! (Why?)

Сын маминой подруги завидует: как дважды выиграть Премию Алисы

Вот уже почти год Яндекс вручает денежную Премию Алисы за самые популярные и интересные навыки для своего голосового ассистента. Анна Савинкова, не будучи программистом, гейм-девелопером или ux-дизайнером, разработала голосовой квест «Цитадель» в двух частях, каждой из которых удалось завоевать Премию в категории «Игры и развлечения».

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


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

Идея навыка и выбор инструмента


Идея «Цитадели» пришла случайно после изучения библиотеки звуков Алисы: раз там есть звуки зомби, значит, надо делать игру про зомби! По сути, весь сценарий был придуман под имеющиеся звуки в библиотеке Яндекса. А с июня, кстати, появилась возможность добавлять свои аудиофайлы (каждая запись должна быть не дольше двух минут, а всего можно загрузить до 1 ГБ записей).

У меня была практика разворачивать навыки самостоятельно на Python, но стало лень оплачивать хостинг ̶и̶ ̶в̶о̶̶̶т̶̶̶ ̶̶̶э̶̶̶т̶̶̶о̶̶̶ ̶̶̶в̶̶̶о̶̶̶т̶̶̶ ̶̶̶в̶̶̶с̶̶̶ё̶̶̶, так что пришлось переходить попеременно с сервиса Alfabot на Verter и обратно, пока где-то я не увидела статью про конструктор Aimylogic от Just AI. Ради фана сделала пару навыков с http-запросами, поигралась с переменными, и мне этот функционал очень понравился. А по-настоящему я влюбилась в интерфейс Aimylogic, наверное, из-за стрелочек. Обожаю mind maps, и то, что именно так в Aimylogic выглядит сценарий, стало решающим фактором в выборе сервиса.

Сценарий игры набрасывался в обычном доке:

Если коротко про сюжет, то игроку в «Цитадели» нужно собирать предметы для выживания и использовать их в драках с врагами. Чтобы узнать уровень своего здоровья и прочекать, что у игрока есть из снаряжения, нужно просто сказать Алисе кодовое слово «Рюкзак» — в нем-то и лежат найденные артефакты.

Фича с рюкзаком родилась сразу, потому что «артефакты» и уровень ХП для геймеров — наше всё. Тексты в итоге, увы, из-за ограничений по количеству символов пришлось немного сократить: сначала из-за ограничения Алисы в 256 символов, затем из-за невозможности быстрого ответа вебхука в сочетании с изображением и фонетической разметкой. Но позже этот вопрос был решен.

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

Как работает «Цитадель»


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

Соответственно, как только игрок съедает отравленные ягоды, простым арифметическим действием вычитания мы уменьшаем его показатель здоровья. Изначально баланс предполагал, что ягоды будут отбирать 50% здоровья, и в сочетании с укусами волков наступал бы gameover, но впоследствии пришлось от этого отказаться. Почему — об этом чуть позже.

Как устроен рюкзак


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

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

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

Как выглядит рюкзак в Aimylogic:

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

Проблема распознавания речи


В случае неверного распознавания ответа пользователя, когда ни один из возможных вариантов ответа в логике игры не предусмотрен, лучше, если ошибка будет интерпретирована в пользу пользователя, потому что the show must go on. Для этого в сценарии были исключены возможности повторения одного и того же контента, если ответ не распознан. Есть вероятность, что пользователя может раздражать, когда сценарий «циклится» на одном и том же месте при неверном ответе. Но это конкретно для «Цитадели». С другой стороны, если игра с повышенным уровнем сложности, то, наверное, это может быть оправдано.


Одна из иллюстраций к «Цитадели»

Локации и «шматок сала»


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

Продвижение


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

Яндекс.Дзен
Что касается Дзена, то из-за механизма «кармы» эффективность у публикаций проявилась с третьей недели, когда пост получал больший охват. Первые публикации не набирали и 2 000 показов, а вот последующие — стабильно 10 000+.

Фейсбук

Чуть позже я еще пробовала подключить Facebook, но меня задушила жаба пришлось отказалась от этой идеи, так как там нет таргетинга на пользователей Яндекс.Браузера. И с бюджетом в 500 рублей доступна оказалась только оплата за показы. Нет смысла зазывать пользователя в игру для Алисы, если у него нет Алисы или браузера с Алисой. Может быть, Алиса у части пользователей и установлена, но конверсия из показа объявления в прохождение игры будет мизерной. Пустая трата денег.

ВКонтакте

Лучшую конверсию показали объявления Вконтакте, старгетированные на пользователей до 18 лет. Средняя стоимость перехода на страницу навыка — 2-3 рубля, если интересно (диплинки прямого захода в навык на тот момент еще не появились). И лучше всего проявили себя самодельные видео сервиса рекламного кабинета ВКонтакте. За все время продвижения было потрачено около 1500 рублей на разные форматы креативов. Ниже пример части объявлений:

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

Отзывы ВКонтакте

Для сравнения: на страничке навыка в платформе Диалогов у «Цитадели» всего 5 отзывов, а в группу ВКонтакте и в личку дети прислали десятки отзывов, что стало полной неожиданностью. Некоторые из них имели весьма конкретные претензии: по качеству картинок, сценария, уровню сложности и т.д. Логично, что дети будут общаться на той площадке, которая им интересна.

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

Внесение изменений


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

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

Целевая аудитория


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

Проблемы целевой аудитории и статистических данных

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

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

Показатели таргета на аудиторию 30+. 927 скрытий из 1554 показов

Показатели таргета на аудиторию до 21 года. 262 скрытия из 19 000 (!) показов

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

Трафик из Каталога Алисы


Так как Яндекс выделил квесты и викторины в отдельную подкатегорию на главной странице в каталоге, то мне тоже захотелось попасть в категорию квестов. И не зря — трафик заметно вырос после попадания в нужную рубрику. Хотя самый большой бум трафика был из рубрики «Новинки»: более 1000 пользователей в день. Как попасть в «Новинки» — до сих пор загадка. «Цитадель» оказалась там спустя продолжительное время, и это далеко не 2-3 дня (вторая часть игры попала в «Новинки» уже быстрее, примерно спустя неделю).

Дважды в одну воду: вторая Премия Алисы за вторую часть «Цитадели»


Вторую часть «Цитадели» я, воодушевленная дебютом, сразу планировала делать совместно с просто потрясающими иллюстраторами-художниками из Miroedova School (все иллюстрации к игре в этом посте — их талантливых рук дело), которые вызвались на голом энтузиазме помочь со сложными иллюстрациями к сценарию.

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

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

Что дальше


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

Сейчас мы будем замерять маркетинговые бизнес-показатели на примере этого конкретного субъекта малого бизнеса: такие, как LTV, CRR и ATV до внедрения использования голосового бота, а затем замерим их на том же промежутке времени после, и сравним. Результат непредсказуем, но ожидаем. Кейсов по использованию голосовых ассистентов либо нет, либо очень мало, так что будет польза для всего сообщества голосовых интерфейсов. Время покажет.

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

Let's block ads! (Why?)

Open source: разработчик видеокарт раскрыл документацию для драйверов под Linux

Этот разработчик — Nvidia. Рассказываем, что было передано в open source, и обсуждаем мнения.


Фото — Caspar Camille Rubin — Unsplash

Что за документация


В каком-то смысле событие можно назвать знаковым. Это первый раз, когда Nvidia выкладывает документацию в большом объеме. Компания публикует спецификации с 2012 года, но до сегодняшнего дня открывали только относительно небольшие их фрагменты. Например, несколько лет назад инженеры предоставили доступ к техническим документам по графическому ядру ARM-платформы Tegra, схеме размещения Device Control Block (DCB) в VBIOS с описанием топологии платы и коннекторов и списку заголовков для GV100 Volta.
Новые спецификации выложили под лицензией MIT — найти их можно в официальном репозитории на GitHub (то же самое, но в HTML). Там есть информация о графических картах Maxwell, Pascal, Volta и Kepler: сведения о таблицах BIOS, управлении частотами, инициализации, режимах энергопотребления, обеспечении защиты в движке Falcon и заголовочных файлах для шейдеров.

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

Мнения сообщества


Автор блога Tom's Hardware отмечает, что развитие проектов вроде nouveau, которые создают свободные драйверы для видеокарт Nvidia, тормозило как раз отсутствие документации. Большое количество спецификаций упростит написание драйверов под Linux, и для этого не придется производить реверс-инжиниринг. Можно ожидать, что в ближайшее время практически все актуальные видеокарты начиная с 2012 года смогут получить улучшенные драйверы.

Этот факт положительно отразится на игровой индустрии, которая начинает проявлять больший интерес к открытой операционной системе. Например, буквально в конце июля Valve (разработчики магазина Steam) внесли ряд изменений в проект Proton для запуска Windows-игр под Linux. Изменения связаны с оптимизацией работы многопоточных игр.


Фото — CMDR Shane — Unsplash

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

Также в ИТ-сообществе есть мнение, что Nvidia сделали спецификацию открытой не только из-за любви к open source. В начале августа AMD реализовали поддержку своего графического процессора Navi 12 для Linux. Возможно, действия Nvidia — это попытка не отстать от конкурентов и не потерять влияние на активно развивающемся рынке.

О других графических open source решениях


В прошлом году в Nvidia представили открытую платформу Rapids. Её цель — упростить разработку алгоритмов МО на GPU. Специалисты по обработке данных пишут код на Python, а система автоматически оптимизирует его для запуска на графической карте с архитектурой CUDA.

Тогда в поддержку нового решения высказались представители таких крупных компаний, как Cisco, Dell, NetApp и Lenovo. В IBM даже провели первые тесты и отметили, что платформа позволит ускорить работу машинных алгоритмов в 50 раз (по сравнению с CPU). Но Rapids и покритиковали — за то, что система работает только с картами от Nvidia.

Свою платформу для HPC на графических картах разрабатывают и в AMD — она называется ROCm (Radeon Open Compute). В отличие от конкурентов, эта система умеет работать практически со всеми GPU. Также разработчики ROCm выбрали C++ вместо Python.

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

О чем мы пишем в наших блогах и социальных сетях:

Новые лицензии для открытого ПО, кто ими занимается
Бенчмарки для Linux-серверов: 5 открытых инструментов

Как обезопасить Linux-систему: 10 советов
Big Data: большие возможности или большой обман

7 сервисов для создания видео и анимации
Как работает техподдержка 1cloud




Мы в 1cloud.ru предлагаем услугу «SSL-сертификаты». Если нужно подтвердить владение доменом или защитить свое авторское право на программу.

Let's block ads! (Why?)