...

суббота, 27 мая 2017 г.

learnopengl. Урок 2.1 — Цвета

Немного реверс-инжиниринга USB flash на контроллере SK6211

[recovery mode] Уязвимость в Web API Lycamobile позволяет управлять любым номером оператора

[Перевод] Создание веб-приложения на Go в 2017 году. Часть 2

Три цикла в аттракторе Лоренца

Почти манифест дизайн-мышления

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

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

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

Продукт в экосистеме


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

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

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

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

В поисках инсайта


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

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

При проведении эмпатии используются методы глубинного интервью: выявляются боли и потребности клиента, составляются персона–модели – своеобразные аватары, которые объединяют в себе потребности социальной группы или выборки определенных клиентов, потому что это качественный анализ. Конечно, мы не в состоянии опросить миллионы и сотни тысяч клиентов, обычно это 6-8 человек, представителей какой-то яркой возрастной или социальной таргет-группы.

На основе опросов составляются портреты пользователей, которые являются носителями чаяний, боли и потребностей определенной категории людей – пенсионеров, студентов, бизнесменов. Мы выявляем базовые потребности, потом переходим на анализ и синтез. У нас есть ворох различных инсайтов и потребностей. Что с этим делать?

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

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

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

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

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

А ведь делать новое – это инстинктивный процесс, который похож на эволюцию. Если ты это не сделаешь — сделает твой конкурент.

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

Так идти на поводу у пользователей или нет?


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

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

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

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

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

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

Не пилить, а изобретать: креативные шаблоны


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

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

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

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

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

Технические противоречия устраняются технико-инженерными методами. Физические противоречия – новый вид, самые сложные, но и они решаются. Альтшуллер считал, что качество решения идей зависит от уровня компромиссности разрешения противоречий. Чем больше компромиссов мы допускаем, тем меньше качество решений.

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

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

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

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

Напоследок разберем важный кейс с Domino’s Pizza. Это достаточно старый поставщик пиццы, и он ничем не отличался от других, пока не ввел принцип: «Если мы не доставим пиццу вовремя, стоимость доставки снизится в два раза». До этого все доставляли вкусную пиццу, но никто не менял стоимость доставки в зависимости от срока. Это подход независимых атрибутов: цена не цена и время – это независимые атрибуты системы, они могут быть внутренние и внешние. А мы организуем между ними зависимость. Цена меняется в зависимости от времени доставки.

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

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

Итоги и советы


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

День в Телеграфе


Кстати, день в Телеграфе обещает быть насыщенным и полезным.

Финалисты технологического конкурса «Продвижение» продолжат борьбу за победу. Помимо презентаций команд, участников ждут выступления лидеров IT-индустрии по актуальным темам мира технологий и мастер-классы. Откроют конференцию выступления представителей топ-менеджмента «Сбербанка». Для профессионалов IT будут организованы выступления экспертов по темам front-end и back-end разработки. В экспозоне в течение дня для участников будут проходить различные демо в области искусственного интеллекта, виртуальной и дополненной реальности, а также будут представлены прототипы на основе технологии биометрии.

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

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



Книги для мышления и размышления


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

Брюс Стерлинг «Shaping Things» — известный фантаст, владеет футурологической лабораторией, в которой они исследуют будущее вещей. В книге рассматривает аспекты совершенствования системы в такой парадигме, что человек не создатель системы, а инструмент для ее совершенствования. У системы своя внутренняя логика жизни, и человек – творец теряет свою функцию и становится таким инструментом для совершенствования системы

Классика, читать обязательно: Альтшуллер Г.С. Алгоритм изобретения. Создал матрицу ТРИЗ, его методы легли в основу многих методов современных методов проектирования.

В книге «Creativity in product innovation» более детально рассматриваются аспекты применения креативных шаблонов, это ученики Альтшуллера, они активно развивают его теории.

Роберт Персинг «Дзен и искусство ухода за мотоциклом» — рекомендуем прочитать всем обязательно, культовая книга 70-х годов о философском аспекте восприятия мира через концепцию лирика и физика.

Еще советуем посмотреть фильм Кубрика «Космическая Одиссея» 2001 г.

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

А вы используете дизайн-мышление? Не стесняйтесь и задавайте свои вопросы, будем рады пообщаться с вами в комментариях к статье.

Комментарии (0)

    Let's block ads! (Why?)

    [Перевод] Реверс-инжиниринг игры Lost Vikings

    пятница, 26 мая 2017 г.

    [Перевод] О дженериках в PHP и о том, зачем они нам нужны

    Russian Code Cup — по следам отборочного раунда


    14 мая прошёл отборочный раунд Russian Code Cup 2017. По традиции выкладываем разбор задач и подводим итоги.


    A. Маленькие числа
    B. Новая клавиатура
    C. Складывание фигуры
    D. Остроугольные треугольники
    E. Объединение массивов
    F. Два поддерева


    В раунде участвовали 603 человека: приблизительно по 200 лучших программистов с каждого квалификационного раунда. По результатам отборочного раунда мы взяли в финал 55 участников.


    Все шесть задач отборочного раунда не смог решить ни один участник. С пятью задачами справились 15 человек. С четырьмя — еще 55 участников.


    Трое лучших:


    1. На первом месте со значительным отрывом от преследователей (15 минут) оказался Ипатов Михаил из Костромы.
    2. Второе место занял Тихомиров Михаил из Москвы.
    3. На третьем месте — Пышкин Игорь из Санкт-Петербурга.

    Кроме того, в топ-10 попали:


    1. Митричев Петр, Цюрих, Швейцария
    2. Геннадий Короткевич, Санкт-Петербург, Россия
    3. Александр Останин, Долгопрудный, Россия
    4. Ершов Станислав, Санкт-Петербург, Россия
    5. Djokic Nikola
    6. Данилюк Алексей, Одинцово, Россия
    7. Du Yuhao, Пекин, Китай

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


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


    A. Маленькие числа


    Ограничение по времени — 2 секунды
    Ограничение по памяти — 256 мегабайт


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


    Сначала он написал в тетрадке числа a и b, после чего решил, что будет последовательно производить с ними одну из трёх операций:


    • Поделить оба числа на какой-то из их общих делителей;
    • Поделить a на один из его делителей g, а b умножить на g;
    • Поделить b на один из его делителей g, а a умножить на g.

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


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


    Формат входных данных


    Входные данные содержат несколько тестовых наборов. В первой строке задано количество тестов t (1 ≤ t ≤ 500).


    Каждый тест описывается следующим образом: в единственной строке описания теста содержатся два числа a и b (1 ≤ a, b ≤ 109) — любимые числа Влада.


    Формат выходных данных


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


    Если ответов несколько, то разрешается вывести любой из них.


    Примеры


    Входные данные
    2
    4 5
    4 6


    Выходные данные
    1 5
    2 3


    Разбор задачи

    Для начала разложим числа a и b на простые.


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


    Очевидно, что чётность вхождения простых чисел в произведение ab не меняется во всех операциях. Тогда давайте оставим все простые в первой степени. Остались числа p1, p2, ..., pn. Давайте назовём произведение всех этих простых чисел d, d ≤ ab. Утверждается, что этих простых не может быть больше 14. Если 1 ≤ a, b ≤ 109, то произведение ab ≤ 1018, а произведение первых 15 простых чисел превышает 1018). Теперь заметим, что конечный ответ — пара чисел (x, y) таких, что xy = d. Из этого следует, что второй элемент пары определяется однозначно по первому. Переберём всевозможные делители d за число x за O(2n), и выберем наилучшую пару.


    B. Новая клавиатура


    Ограничение по времени — 2 секунды
    Ограничение по памяти — 256 мегабайт


    Петя купил новую клавиатуру. Она поддерживает n раскладок. В каждой раскладке можно набирать некоторое подмножество строчных букв латинского алфавита. Пронумеруем раскладки от 1 до n.


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


    • Переключить раскладку. Тогда, если текущая раскладка имела номер i, новая раскладка будет иметь номер i mod n + 1, где mod — операция взятия остатка по модулю. Если предыдущим действием Петя также переключал раскладку, это действие займет b миллисекунд, иначе это действие займет a миллисекунд.
    • Набрать символ. Петя может добавить в конец текущего сообщения любую букву, содержащуюся в текущей раскладке. На это действие он потратит c миллисекунд.

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


    Формат входных данных


    В первой строке содержатся четыре целых числа n, a, b и c — количество раскладок у клавиатуры, и количество миллисекунд, необходимых для совершения переключения раскладки и набора символа (1 ≤ n ≤ 2 000, 1 ≤ b ≤ a ≤ 109, 1 ≤ c ≤ 109).


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


    В последней строке содержится строка s — сообщение, которое хочет набрать Петя (длина строки s от 1 до 2 000). Строка s состоит из строчных латинских букв.


    Формат выходных данных


    Выведите единственное целое число — минимальное количество миллисекунд, необходимое, чтобы набрать сообщение. Выведите  - 1, если набрать сообщение невозможно.


    Примеры


    Входные данные
    5 3 2 1
    abc
    d
    e
    f
    def
    abcdef


    Выходные данные
    15


    Входные данные
    1 1 1 1
    a
    z


    Выходные данные
    -1


    Разбор задачи

    Используем для решения метод динамического программирования. Состояние — d[i][j][k], где i — флаг, обозначающий тип предыдущего действия (0, если это было переключение раскладки, и 1, если это был набор символа), j — номер текущей раскладки, и k — количество набранных символов. Значение — минимальное время, необходимое, чтобы достичь этого состояния.


    Переберем k. Для фиксированного k переберем j от 1 до n два раза. Обновим d[0][j % n + 1][k] = min(d[0][j % n + 1][k], min(d[0][j][k] + b, d[1][j][k] + a)). Перебрать j от 1 до n два раза нужно потому, что после набора k-го символа может быть включена раскладка с номером большим, чем раскладка, в которой будет набран следующий символ, и будет необходимо произвести переключение раскладок по циклу до нужной. После этого переберем j еще раз и обновим значения для k + 1. Если в j-й раскладке есть k-й символ сообщения, d[1][j][k + 1] = min(d[0][j][k], d[1][j][k]) + c.


    В конце ответ равняется min(d[1][j][m]), где m = length(s), по всем j от 1 до n.


    C. Складывание фигуры


    Ограничение по времени — 2 секунды
    Ограничение по памяти — 256 мегабайт


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


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


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


    Рассмотрим второй пример теста из условия. В нем сложенная фигура предславляет собой букву «П», а исходная фигура состоит из 12 клеток. Один из возможных вариантов исходной фигуры представлен на рисунке (сгиб происходит по прямой y = 3):


    image


    Формат входных данных


    Входные данные содержат несколько тестовых наборов. В первой строке задано количество тестов t (1 ≤ t ≤ 200).


    Каждый из следующих t тестов описывается следующим образом: в первой строке описания теста содержится два целых числа n, k — количество закрашенных клеток, из которых состоит сложенная фигура Васи и количество клеток в исходной фигуре (1 ≤ n < k ≤ 105).


    В каждой из следующих n строк содержатся два числа xi, yi — координатылевого нижнего угла i-й закрашенной клетки ( - 108 ≤ xi, yi ≤ 108). Гарантируется, что все закрашенные клетки различны и образуют связную фигуру.


    Гарантируется, что сумма k во всех тестах одних входных данных не превосходит 105.


    Формат выходных данных


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


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


    Линия сгиба должна быть выведена одним из 4 способов:


    • L num — сгиб производится по прямой x = num, левая часть накладывается поверх правой;
    • R num — сгиб производится по прямой x = num, правая часть накладывается поверх левой;
    • U num — сгиб производится по прямой y = num, верхняя часть накладывается поверх нижней;
    • D num — сгиб производится по прямой y = num, нижняя часть накладывается поверх верхней.

    Все x'i, y'i, а также координата линии сгиба по модулю не должны превышать 109. Гарантируется, что такая фигура существует. Если существует несколько подходящих ответов, разрешается вывести любой из них.


    Примеры


    Входные данные
    2
    7 14
    0 0
    0 1
    0 2
    1 2
    2 2
    2 1
    2 0
    7 12
    0 0
    0 1
    0 2
    1 2
    2 2
    2 1
    2 0


    Выходные данные
    L 0
    0 0
    0 1
    0 2
    1 2
    2 0
    2 1
    2 2
    -1 0
    -1 1
    -1 2
    -2 2
    -3 2
    -3 1
    -3 0
    U 3
    0 0
    0 1
    0 2
    1 2
    2 2
    2 1
    2 0
    0 3
    1 3
    2 3
    0 4
    2 4


    Разбор задачи

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


    Возьмём любую из клеток сложенной фигуры с минимальной координатой по оси OX — клетку (xi, yi). За линию сгиба возьмём вертикальную прямую x = xi, касающуюся этой клетки. Теперь слева нужно восстановить k – n клеток первоначальной фигуры, чтобы после накладывания левой части вдоль линии сгиба на правую получилась сложенная фигура из входных данных. Так как k – n ≤ n (иначе после сгиба стало бы больше n клеток), достаточно выделить из сложенной фигуры k – n клеток, образующих связную фигуру, содержащую клетку (xi, yi). Это можно сделать простым обходом в глубину.


    D. Остроугольные треугольники


    Ограничение по времени — 4 секунды
    Ограничение по памяти — 256 мегабайт


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


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


    Формат входных данных


    Входные данные содержат несколько тестовых наборов. В первой строке задано количество тестов t (1 ≤ t ≤ 666).


    Каждый из тестов описывается следующим образом: в первой строке описания теста содержатся число n (3 ≤ n ≤ 2000) — количество точек.


    В следующих n строках содержатся по два числа xi, yi ( - 109 ≤ x, y ≤ 109) — координаты точек. Гарантируется, что все точки в одном тесте различные.


    Суммарное количество точек по всем тестам одних входных данных не превосходит 2000.


    Формат выходных данных


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


    Примеры


    Входные данные
    2
    5
    1 1
    2 2
    3 3
    4 1
    6 4
    5
    0 0
    3 1
    5 1
    5 -1
    1 3


    Выходные данные
    3
    4


    Разбор задачи

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


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


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


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


    Время работы решения: O(n2log(n)).


    E. Объединение массивов


    Ограничение по времени — 4 секунды
    Ограничение по памяти — 256 мегабайт


    Рассмотрим два массива натуральных чисел A = [a1, a2, ..., an] и B = [b1, b2, ..., bm]. Будем называть их k-объединением лексикографически минимальный массив чисел R длиной k, который разбивается на две непустые подпоследовательности, первая из которых является подпоследовательностью массива A, а вторая — подпоследовательностью массива B.


    Формально говоря, необходимо найти лексикографически минимальный массив R = [r1, r2, ..., rk], для которого существуют непустые наборы индексов 1 ≤ i1, 1 < i1, 2 < ... < i1, t ≤ n и 1 < j1, 1 < j1, 2 < ... < j1, k - t ≤ m в исходных массивах, а также наборы индексов 1 ≤ i2, 1 < i2, 2 < ... < i2, t ≤ k и 1 ≤ j2, 1 < j2, 1 < ... < j2, k - t ≤ k, такие что:


    • Для любых 1 ≤ p ≤ t, 1 ≤ q ≤ k - t выполнено i2, p ≠ j2, q;
    • Для любого 1 ≤ p ≤ t выполнено ai1, p = ri1, p;
    • Для любого 1 ≤ p ≤ k - t выполнено bj1, p= rj1, p.

    Например, если A = [1, 2, 1, 3, 1, 2, 1], B = [1, 2, 3, 1], а k = 9, то их k-объеднением будет R = [1, 1, 1, 1, 2, 1, 2, 3, 1] (подпоследовательность из первого массива — [1, 1, 1, 2, 1], подпоследовательность из второго массива — [1, 2, 3, 1]).


    По двум данным массивам A и B, а также числу k найдите их k-объединение R.


    Формат входных данных


    В первой строке ввода содержится число n — размер массива A (1 ≤ n ≤ 3000).


    Во второй строке содержится n чисел ai — массив A (1 ≤ ai ≤ 3000).


    В третьей строке содержится число m — размер массива B (1 ≤ m ≤ 3000).


    Во четвертой строке содержится m чисел bi — массив B (1 ≤ bi ≤ 3000).


    В последней строке содержится число k (2 ≤ k ≤ n + m).


    Формат выходных данных


    Выведите k-объединение заданных во входном файле массивов.


    Примеры


    Входные данные
    7
    1 2 1 3 1 2 1
    4
    1 2 3 1
    9


    Выходные данные
    1 1 1 1 2 1 2 3 1


    Разбор задачи

    Приведём два решения этой задачи: за O(k2•log(k)) и O(k2).


    Решение за O(k2•log(k))


    Разобьём решение задачи на три пункта:


    1. Для каждого массива X (A или B) и каждой длины 1 ≤ length ≤ |X| найдём minSubsequenceX[length] — лексикографически минимальную подпоследовательность X длины length.
    2. Переберём длину подпоследовательности в первом массиве — 1 ≤ t ≤ min(k – 1, |A|). Если 1 ≤ k – t ≤ |B|, возьмём minSubsequenceA[t] и minSubsequenceB[k – t], их надо объединить.
    3. Объединим две подпоследовательности в одну, получив тем самым лексикографически минимальную подпоследовательность длины k, обновим ответ.

    Чтобы найти minSubsequenceX[length] для каждого length, сделаем вот что:


    • Посчитаем next[i][c], в котором будет храниться следующее после i вхождение символа c в X.
    • Посчитаем firstSymbol[length][i] — первый символ лексикографически минимальной подпоследовательности массива X[i..|X| – 1] длиной length. Для этого заметим следующее:
      • Если j1 = next[i][1] существует, то firstSymbol[1][i], firstSymbol[2][i],… firstSymbol[|X| – j1][i] начинаются с 1;
      • Если j2 = next[i][2] существует, то firstSymbol[|X| – j1 + 1][i], ..., firstSymbol[|X| – j2][i] начинаются с 2;
      • ...
      • Если j|alphabet| = next[i][|alphabet| существует, то firstSymbol[max(|X| – j1, |X| – j2, ..., |X| – j|alphabet| - 1) + 1][i], ..., firstSymbol[|X| – j|alphabet|][i] начинаются с |alphabet|.
        где alphabet — максимальное возможное число в массиве X.
    • Посчитав firstSymbol[length][i], можно восстановить лексикографически минимальную подпоследовательность X для каждой длины итеративно по одной букве.

    Этот пункт работает за O(|X|2).


    Найдя две лексикографически минимальные подпоследовательности SA и SB, их надо объединить в одну лексикографически минимальную длиной k. Будем двигаться по подпоследовательностям двумя указателями p1 и p2. Если SAp1 ≠ SBp2, то двигаем указатель, стоящий на меньшем числе. Если SAp1 = SBp2, двоичным поиском найдём наибольший общий префикс SA[p1..|SA|] и SB[p2..|SB|] и сравним следующие числа. Для сравнения подотрезков SA и SB можно использовать хеши.


    Этот пункт работает за O((|SA| + |SB|)•log(max(|SA|, |SB|))) = O(k•log(k)).


    Итого, суммируя все три пункта, получаем асимптотику O(|A|2 + |B|2 + k2•log(k)) = O(k2•log(k)).


    Решение за O(k2)


    Назовём массив A нулевым, а массив B — первым. Будем строить ответ по одному элементу. Также станем поддерживать вспомогательное значение dp[i][j], где i — номер массива (0 или 1), а j — индекс в этом массиве. dp[i][j] равно минимальному индексу в массиве 1 – i, с которого можно продолжать строить ответ, если в массиве i мы остановимся на индексе j.


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


    После добавления найденного элемента v в ответ за O(|A| + |B|) обновим значения dp. Для этого будем пользоваться посчитанным в предыдущем решении массивом next.


    F. Два поддерева


    Ограничение по времени — 4 секунды
    Ограничение по памяти — 256 мегабайт


    Рассмотрим подвешенное дерево. Рассмотрим вершину v, имеющую в поддереве хотя бы одну вершину на расстоянии k от v. Будем называть k-поддеревом вершины v дерево, полученное из поддерева вершины v удалением всех вершин, расстояние от которых до v больше k. Например, на иллюстрации ниже красным отмечено 2-поддерево вершины 3.


    image


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


    image


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


    На рисунке приведены деревья из примеров.


    image


    В первом примере корни одинаковых 1-поддеревьев — это вершины 2 и 3.


    Во втором примере корни одинаковых 3-поддеревьев — это вершины 1 и 4.


    В третьем примере корни одинаковых 0-поддеревьев — это вершины 1 и 2.


    Формат входных данных


    В первой строке задано число t — количество тестов (1 ≤ t ≤ 104).


    Каждый из t тестов описывается следующим образом: в первой строке задано число n — количество вершин (2 ≤ n ≤ 105).


    Далее следует n строк. В i-й из них задано число cnti — количество детей вершины i, а далее следуют cnti чисел — номера детей вершины i. Вершины нумеруются с единицы. Корнем дерева является вершина 1. Гарантируется, что заданный граф является деревом с корнем в 1.


    Сумма n по всем тестам в одних входных данных не превосходит 2·105.


    Формат выходных данных


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


    Примеры


    Входные данные
    3
    5
    2 2 3
    1 4
    1 5
    0
    0
    8
    1 2
    2 3 4
    0
    1 5
    2 6 7
    0
    1 8
    0
    2
    1 2
    0


    Выходные данные
    1
    3
    0


    Разбор задачи

    По условию в k-поддереве обязательно есть вершины на глубине k. Временно отменим это требование.


    Рассмотрим все k-поддеревья для некоторого k. Их можно разбить на классы эквивалентности. Каждой вершине поставим в соответствие ck[v] — метку класса эквивалентности, которому принадлежит её k-поддерево.


    При k = 0 все c0[v] равны, так как 0-поддерево любой вершины — это она сама.


    При k = 1 c1[v] равно количеству детей вершины.


    Научимся по массивам ck[v] и cm[v] строить массив ck + m[v]. Для начала поставим в соответствие каждой вершине v массив arrk + m[v], который будет однозначно задавать класс эквивалентности её k + m — поддерева. Пусть u1, ..., us — потомки вершины v на расстоянии k в порядке обхода dfs. Тогда поставим в соответствие вершине v массив arrk + m[v] = ck[v], cm[u1], ..., cm[us]. То есть k + m — поддерево вершины задаётся k-поддеревом вершины и m-поддеревьями нижней части k-поддерева. Ниже приведена иллюстрация для k = 3 и m = 1.


    image


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


    Чтобы преобразовать массивы arrk + m[v] в числа ck + m[v], можно захешировать их, использовать бор или unordered_map из массива в номер. Время работы будет O(n), поскольку каждая вершина встречается в списках arr только один раз.


    Имея массив ck[v], можно легко проверить, что существует два одинаковых k-поддерева. Для этого найдём две вершины с одинаковым ck, при этом нужно рассматривать только вершины, у которых есть потомки на расстоянии k от неё (это то требование, которое мы отменили в начале).


    Чтобы найти максимальное k, посчитаем c1[v], c2[v], ..., c2t[v] (2t — максимальная степень двойки, не превосходящая n). После этого используем аналог двоичных подъёмов по k: начнём с k = 0 и по очереди попытаемся прибавить к нему 2t, 2t – 1, ..., 20.


    Время работы решения: O(nlog(n)).


    Планы на будущее


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


    А напоследок делимся с вами одной из идей: возможно, в следующем году мы сделаем специальные номинации вроде «Лучший в языке». Тогда, например, обладатель лучшего решения на С++ получит отдельный приз. Что скажете?

    Комментарии (0)

      Let's block ads! (Why?)

      Скит, Core, рок-н-ролл: как прошёл DotNext 2017 Piter

      Когда IT-конференция проходит много лет подряд, она становится своего рода «годичными кольцами»: по ней можно проследить, как технологии росли и развивались со временем. Скажем, в прошлом июне можно было увидеть на петербургском DotNext, как Дино Эспозито распекал (ASP).NET Core за неготовность к реальным задачам. А в декабре на московском DotNext интонация уже изменилась: мол, тащить Core в продакшен ещё не требуется, но вот разбираться с ним уже стоит.

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


      Тренды


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

      Был, правда, и доклад с «ознакомительным» названием «What is .NET Standard?». Вот с тем, как .NET Standard соотносится с .NET Core, в сообществе ещё нет полного понимания, на Stack Overflow об этом продолжают спрашивать. И с этим связан отдельный забавный момент: как раз послушав этот доклад на DotNext, Джон Скит смог почувствовать себя увереннее, отвечая на соответствующий вопрос на SO. Будем теперь гордиться тем, что мы как организаторы конференции косвенно помогли легенде Stack Overflow с ответом!




      Кроссплатформенность

      С .NET Core связан выход Microsoft за границы привычного мира собственной платформы. Так что неудивительно, что интерес к другим платформам теперь также растёт. Могли ли мы подумать ещё несколько лет назад, что на .NET-конференции в названиях сразу двух докладов будет слово «Linux»? А автор одного из них, Денис Иванов, часть времени ещё и пишет свой C#-код под macOS. В общем, «столкновение континентальных плит» в разгаре.

      А вместе с кроссплатформенностью и Linux в .NET-мир пришла контейнеризация. В других экосистемах вроде Java эта тема стала актуальна раньше — а теперь и дотнетчикам она интересна, так что о ней говорили и Алекс Тиссен (Xpirit), и Мете Атамел (Google). Любопытно будет на следующих DotNext посмотреть вот на что: а смогут ли контейнеры, уже показавшие себя в Linux, как следует прийти и на Windows?



      Open source

      Ещё одно ощущение от конференции — рост интереса к опенсорсу в .NET-мире. Адам Ситник прямо в название доклада вынес «My awesome journey with open source», но ощущение возникало и от общения с теми спикерами, чьи выступления были посвящены совсем другому.

      В этом можно увидеть две составляющих. Во-первых, то, что Microsoft в самом .NET взял курс на открытый исходный код: конечно, это не новость, но такая махина не разворачивается мгновенно, поэтому эффект продолжает ощущаться спустя продолжительное время. А во-вторых, похоже, что круги расходятся шире. .NET-сообщество, ранее привыкшее к «закрытому» флагману, само тоже оказывалось менее опенсорсным, чем, например, Java-сообщество. А теперь вслед за флагманом меняется и оно, с интересом занимаясь проектами, созданными не Microsoft. Библиотеку BenchmarkDotNetАндрей Акиньшин начинал в одиночку, а сейчас развивает с помощью людей вроде того же Ситника. Cразу после DotNext она пересекла на GitHub рубеж в 2000 звёзд — мы будем считать, что конференция этому поспособствовала!



      Rider

      IDE от JetBrains бередит умы дотнетчиков не первый месяц. Однако теперь он стал куда ближе к релизу, обзавелся расценками, и всё больше разработчиков (включая спикеров DotNext) использует его для рабочих проектов. Например, среди них уже упомянутый Денис Иванов, установивший Rider на свой макбук: Visual Studio for Mac пока далеко до возможностей Win-версии, так что сейчас именно JetBrains помогают дотнетчикам работать под macOS. На предыдущих DotNext уже заходила речь о внутренностях Rider, а теперь Дмитрий Иванов (JetBrains) рассказывал о возможностях IDE, повышающих производительность разработчика.

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



      Новые рубежи: от AI до HoloLens

      Кроме тем, находящихся в центре внимания разработчиков, на конференциях можно увидеть ещё и доклады, показывающие передний край развития. На DotNext 2017 было два ярких примера. Михаил Самарин (Futurice), на открытии конференции впечатливший многих демонстрацией HoloLens, в своём докладе рассказывал о разработке для этой (пока что) экзотической платформы, а на стенде Futurice давал желающим прикоснуться к ней. А Дмитрий Сошников (Microsoft) говорил о глубинном обучении и чат-ботах.

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


      Спикеры

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

      Джон Скит

      У Скита высочайший статус в .NET-сообществе — но это ещё не означало автоматически, что он понравится аудитории в качестве спикера. Может, это в ответах на Stack Overflow он звезда, а вот удерживать внимание русскоговорящей аудитории часовым англоязычным выступлением не сможет? В начале Скит заявил «я полночи ковырялся с Roslyn, так что если усну на сцене, киньте в меня чем-нибудь», что могло добавить опасений — но в итоге спать не приходилось ни ему, ни залу. Фидбэки показали: хотя некоторым зрителям мешал британский акцент, в целом оценки оказались очень высокими.

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

      • «Обычно о бессознательном предубеждении говорят в контексте расизма и сексизма, но у нас всех есть другое предубеждение: децимализм. Мы бессознательно считаем, что десятичные числа лучше двоичных»
      • «Разнообразие культур, как бы я его ни любил, испортило нам всё программирование. Можно мы все будем использовать один набор символов?»
      • «UTF-8 не решил все проблемы. Если два пользователя с одинаковыми именами используют разные браузеры, может оказаться так, что в одно и то же поле у одного имя влезет, а у другого нет. Я в этом ощущаю поломку».


      Саша Гольдштейн

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


      Алексей Савватеев

      Этот популяризатор математики не связан напрямую с .NET, и его доклад был посвящён теории игр. И, как выяснилось, вполне можно на протяжении часа держать в оживлении сотни дотнетчиков, не сказав ничего про .NET. Примеры, от cobra effect до способов минимизировать взяточничество, вызвали в заре много оживления, а на вопросы сразу предлагали множество вариантов. Вот как вы думаете, как проверяющий может снизить уровень взяток в том случае, если взятки могут превышать размер штрафа, так что даже после штрафа взяточник остаётся в плюсе?


      Дилан Битти

      Хотя этот спикер выступал не с кейноутом, его решительно невозможно не упомянуть — на конференции он покорил множество зрителей. Причём часть из них ещё до доклада: привезя с собой гитару и другое музыкальное оборудование, он прямо на вечеринке после первого дня DotNext устроил импровизированный рок-концерт, отлично исполнив песни от «Sultans of Swing» Dire Straits до «Seven Nation Army» The White Stripes.

      В докладе Битти говорил о том, как идеи REST сталкиваются с суровой реальностью и что получается на практике — и там тоже по-своему устроил шоу. Там фигурировали примеры «реплик, которые получает разработчик», и хотя Дилан не говорит по-русски, для зрителей DotNext он решил русифицировать эти реплики. Причём не просто перевёл на слайдах, а записал себе подсказки латиницей и старательно с выражением их зачитывал: «Vash idiotski API peregruzhaet nashu bazu dannikh!» Реакцию зала надо было видеть.

      В то же время не стоит считать, что в докладе Дилана было сплошное безответственное веселье. Он, в частности, отмечал, что идеи REST хороши в долгосрочной перспективе (вначале приходится приложить больше усилий, но в итоге это того стоит) — так что получается как раз ответственность перед «будущим собой». Дилану ли это не понимать: он работает в компании Spotlight с 2000-го, так что регулярно сталкивается с собственным старым кодом, и знает, как желание срезать углы может аукнуться в будущем.

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

      Комментарии (0)

        Let's block ads! (Why?)

        Корейские коллеги: понять и простить

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

        image

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

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

        Иерархичность


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

        Дистанция власти


        Южная Корея относится к странам с высоким индексом дистанции власти. Это значит, что глубина дерева иерархии будет в среднем выше, чем в западных организациях. Отношение поголовья начальства к поголовью подчинённых тоже будет выше. К начальнику обращаются «на вы и шёпотом», оспаривать решения руководства не принято. Кроме того, чем выше руководитель, тем сложнее до него физически добраться.
        Для нас, в принципе, является нормальной аргументированная критика решений руководства. Но в Корее это может оказаться страшным оскорблением, особенно если делать это в присутствии других подчинённых. Причём обидится, скорее всего, не только сам начальник, но и весь корейский коллектив будет смотреть на вас косо.
        Высокий индекс дистанции власти прошит в корейское сознание настолько надёжно, что иногда подавляет даже инстинкт самосохранения. Вот, например, хрестоматийные примеры из истории корейской гражданской авиации: Катастрофа Boeing 747 на Гуаме и Катастрофа Boeing 747 под Лондоном. Одной из причин в обоих случаях было то, что второй пилот просто не решился указать КВС на ошибку. После этих случаев Korean Air пересмотрела процедуры взаимодействия в экипаже, и катастроф у неё с тех пор больше не было.

        Коллективизм и «свой-чужой»


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

        С этим, по-видимому, связано то, что корейцы часто побаиваются иностранцев. Это может проявляться на разных уровнях. Самое простое — вам что-то нужно от корейского коллеги, а он притворяется мёртвым, вдруг отстанете. Или же может случиться синдром «not invented here», когда результаты вашего труда не очень хотят использовать, даже если они объективно хороши. При этом корейские компании широко шагают по миру, открывая свои дочки и покупая другие компании. Допустим, где-то наверху решили, что такое сотрудничество будет выгодным. Что на деле? Интеграция иностранных команд может быть не проработана, рядовые корейцы взаимодействию с этими варварами не рады и потихонечку саботируют. Через два года приходит новое руководство и вообще не знает, что со всем этим заморским хозяйством делать. Конечно, это пессимистичный сценарий, но вполне возможный. Вот пример доктора Линды Майерс, которую нанимали на топовую позицию в SK Group, чтобы она там способствовала глобализации. Наняли, а применить с пользой не смогли.

        Торопливость, оценка сроков и страдания


        Корейцы весьма торопливы. Вся их жизнь — это сплошное «ппалли-ппалли» (빨리-빨리, быстро-быстро). «Лучше день потерять, потом за пять минут долететь», «тише едешь — дальше будешь» — это не про них.

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

        Немного о языке


        Я не буду призывать учить корейский всех, кто столкнулся с корейцами по работе. Всё-таки, это не самый жизненно необходимый навык. Но! Будьте готовы к тому, что корейцы, даже в международных IT-компаниях, далеко не всегда хорошо знают английский. В нашем корейском центре разработки, например, крутят видеоролики, призывающие учить английский. Там показывают грустных иностранцев, вырывающих волосы из бороды каждый раз, когда получили письмо от корейца. К сожалению, это не всегда помогает. Приходилось и документацию на корейском читать, и расшифровывать фразы на konglish, и пользоваться «интерфейсом» в виде говорящего по-английски корейца, когда что-то нужно от тех, кто английского не знает (может быть ещё тот испорченный телефон).
        В корейском быту с английским ещё хуже. Когда я первый раз поехала в командировку, первое, что я сделала — это вышла из автобуса не там и заблудилась. Дак вот, только примерно пятый по счёту таксист попытался понять обалдевшую от страха и жары девочку, которая что-то ему по-английски говорит. Или вот просыпаешься в 7 утра в отеле от некоего звукового сообщения, и не понимаешь, куда бежать и чего от тебя хотят. И конечно же очень приятно уметь прочитать меню на корейском, заказать кофе и попросить не класть лёд в сок. Кроме того, корейцы очень радуются, когда кто-то хоть чуть-чуть может сказать по-корейски. Я думаю, это располагает, и даже немного помогает пробиться через настороженное отношение к иностранцу. В общем, я до сих пор считаю курсы корейского одной из самых вкусных плюшек в соцпакете.

        Вместо вывода


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

        Основы выживания в Корее


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

        Бесполезные факты


        • Если судить по официальному названию, то «Страна утренней свежести» — это на самом деле КНДР.
        • В Корее нет других браузеров, кроме Internet Explorer. Кроме того, почему-то корейские сайты просто невообразимо ужасны.
        • «Совершенный код» Стива Макконнелла не издавался на корейском языке.
        • Вообще-то, у корейцев удобный фонетический алфавит, но иероглифами они тоже иногда пишут. Вот тут иероглиф «север» прямо в заголовке.
        • Старый логотип Pepsi почему-то очень напоминает корейский символ Инь-Ян


        Литература и ссылки для интересующихся


        1. Doing Business with Koreans
        2. Корея без вранья
        3. Корея и корейцы. О чем молчат путеводители
        4. Блог Константина Асмолова
        5. Блог Олега Кирьянова

        Комментарии (0)

          Let's block ads! (Why?)

          [Перевод] Путь к трансдьюсерам на чистом JavaScript

          У вас есть право на анонимность. Часть 2. Законодательство против анонимности

          [Из песочницы] Разбираемся с Conductor

          [Перевод] QR-коды — проблемы безопасности: не поторопились ли мы

          Справочник «пчеловода» или отвечаем на вопросы по микроконтроллерам EFM8 Bee

          Микроконтроллеры семейства EFM8 Bee с каждым днем становятся всё популярнее и уже накопился список частых вопросов, на которые приходится регулярно отвечать. Решил разместить их здесь, чтобы люди, которые стесняются задавать вопросы инженерам компании «ЭФО», могли найти ответы через поисковик.

          Для читателей, кто не знаком с микроконтроллерами EFM8 Bee, вкратце изложу основные особенности этих кристаллов, ответив тем на уже наверняка возникший вопрос: Чем особенны микроконтроллеры EFM8 Bee?

          Микроконтроллеры EFM8 Bee представлены четырьмя семействами «пчел»: Busy Bee, Sleepy Bee, Universal Bee и Laser Bee, каждая из которых имеет свои отличительные особенности. В основу
          EFM8 Bee заложено процессорное ядро CIP-51 с системой команд 51-го процессора, в отличие от которого более 70% команд выполняются за 1-2 такта системной тактовой частоты — такое же как в известных микроконтроллерах C8051Fxxx.

          Не вдаваясь в хитросплетения брендинга и аналогии с пчелами, рассмотрим ключевые особенности этих кристаллов и их технические характеристики:

          1. Серия EFM8 Busy Bee


          Самая бюджетная серия кристаллов, где ключевой акцент ставится на стоимость микросхем. Стоимость самого дешевого микроконтроллера — 0,21$ без учета НДС (0,25$ с учетом НДС) на проекты с годовым объемом от 10 тыс. шт.

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

          • максимальная производительность до 50 MIPS на тактовой частоте до 50 МГц;
          • Flash-память: до 64 кБайт;
          • ОЗУ: до 4352 Байт;
          • линий ввода/вывода общего назначения: до 29;
          • АЦП: 12 бит с максимальной частотой дискретизации до 350 тыс. отсчетов в сек.;
          • до четырех 12-разрядных ЦАП;
          • понижающий регулятор напряжения 5В > 3,3В.

          А что же предлагается за заявленные 0,21$?

          По цене 0,21$ (без учета НДС) предлагается микросхема EFM8BB10F2G-A-QFN20, которая включает:
          • процессорное ядро с производительностью до 25 MIPS на тактовой частоте 25МГц;
          • Flash-память 2 кБайта;
          • ОЗУ 256 Байт;
          • два встроенных тактовых генератора на частоты 24,5 МГц и 80 кГц;
          • интерфейс SMBus / I2C;
          • интерфейс SPI;
          • интерфейс UART;
          • 16 линий ввода/вывода общего назначения;
          • 3-канальный программируемый массив счетчиков;
          • четыре 16-битных таймера/счетчика;
          • два аналоговых компаратора со встроенным ЦАП для гибкой установки порогов;
          • 12-разрядный АЦП с мультиплексором на 15 каналов, источником опорного напряжения и датчиком температуры;
          • 16-разрядный блок CRC;
          • встроенный загрузчик по UART.


          2. Серия EFM8 Sleepy Bee


          Серия кристаллов, ориентированная на приложения с батарейным питанием. Имеет сходные параметры энергопотребления с 32-разрядными микроконтроллерами EFM32 этого же производителя, но не реализованы «интеллектуальные» режимы работы и значительно меньше периферии. Выгода EFM8 Sleepy Bee состоит в меньшей стоимости кристаллов и более простом их освоении.

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

          • максимальная производительность до 25 MIPS на тактовой частоте до 25 МГц;
          • аппаратный контроллер сенсорных клавиатур;
          • ток потребления в активном режиме: 88 мкА/МГц на тактовых частотах от 14 МГц;
          • ток потребления в режиме сна с часами реального времени (тактирование от внутреннего генератора): 0,3 мкА при 1,8В и 0,5 мкА при 3,6В;
          • ток потребления в режиме сна с пробуждением от сенсорной кнопки: 1 мкА (среднее значение);
          • время пробуждения не превышает 2 мкс при использовании внутреннего генератора.

          Аналоговая и цифровая периферия аналогична EFM8 Busy Bee.
          О ценах.
          Младшая микросхема EFM8SB10F2G-A-QFN20, аналогичная по «начинке» минимальному кристаллу из серии EFM8 Busy Bee, предлагается по цене 0,32$ + НДС.
          Более функциональная и в более удобном для многих корпусе QSOP24 микросхема EFM8SB10F8G-A-QSOP24 с 8 кБайт Flash-памяти и 512 Байт ОЗУ предлагается по цене 0,48$ + НДС
          Цены действительны для проектов с годовым потреблением порядка 10 тыс. шт. в год.

          3. Серия EFM8 Laser Bee


          Серия кристаллов EFM8 Laser Bee ориентирована на приложения с аналоговыми измерениями — кристаллы этой серии снабжены 14-разрядным АЦП, который обеспечивает типовое значение сигнал/шум + искажения (SNDR) на уровне 72 дБ, общие гармонические искажения (THD) -74 дБ и динамический диапазон, свободный от гармоник (SFDR) 74 дБ. Помимо этого, кристаллы EFM8 Laser Bee применимы в приложениях, где требуется недорогой микроконтроллер с высокой рабочей тактовой частотой.

          Характеристики кристаллов EFM8 Laser Bee в сухом изложении следующие:

          • максимальная производительность до 72 MIPS на тактовой частоте до 72 МГц;
          • 14-разрядный АЦП последовательного приближения с частотой дискретизации до 900 тыс. отсчетов в секунду с возможностью организации непрерывного сбора данных по всем каналам АЦП без участия процессорного ядра;
          • два либо четыре 12-разрядных ЦАП с возможностью генерации комплементарных синусоидальных сигналов и сигналов произвольной формы;
          • два аналоговых компаратора с перестраиваемым соотношением «время реакции»/«энергопотребление» и гибкой схемой выбора входных сигналов;
          • встроенный калиброванный датчик температуры, обеспечивающий в базовом исполнении измерения с погрешностью в пределах ±3°C, а с применением описанных производителем методик – в пределах ±0,2°C;
          • диапазон рабочих температур всех кристаллов в серии от -40°C до +105°C.

          И уникальность этой серии заключается в сочетании представленных характеристик и цены.
          Для примера
          В «минимальной комплектации» представлена микросхема EFM8LB10F16E-B-QFN24, которая имеет 16 кБайт Flash-памяти и 1.25 кБайт ОЗУ. Её цена составляет 0,54$ + НДС. Более универсальный вариант EFM8LB10F16E-B-QFP32 в корпусе QFP32 предлагается по цене 0,70$ + НДС.
          Наиболее функциональный вариант из серии — EFM8LB12F64E-B-QSOP24 — с 64 кБайтами Flash-памяти, 4.25 кБайтами ОЗУ и четырьмя ЦАП доступен по цене 0,94$ + НДС.
          Цены из расчета на 10 тыс. шт. в год.

          4. Серия EFM8 Universal Bee


          Название серии происходит из названия интерфейса USB, которым снабжены кристаллы этой серии.

          Среди особенностей линейки можно выделить:

          • интерфейс USB Device с режимом пониженного энергопотребления;
          • стабильный генератор тактовой частоты, обеспечивающий работу интерфейса USB без внешнего кварца во всем диапазоне рабочих температур и напряжений питания;
          • регулятор напряжения 5 В > 3,3 В для обеспечения работы устройства от шины USB без использования дополнительного регулятора напряжения;
          • функцию распознавания подключения к зарядному устройству согласно спецификации USB-BCS 1.2.

          Режим пониженного энергопотребления интерфейса USB в EFM8 Universal Bee необходим для работы с автономными устройствами, обмен данными с которыми должен происходить без взаимной нагрузки по питанию.
          Цены радуют
          Устройство с минимумом внешних компонентов (без внешнего кварца и регулятора напряжения) можно построить на микросхеме EFM8UB10F8G-C-QFN20 ценой 0,43$ + НДС, которая помимо интерфейса USB снабжена 8 кБайтами Flash-памяти, 2304 Байтами ОЗУ, 12-разрядным АЦП и типовыми блоками микроконтроллера, которые есть и в других сериях EFM8.

          Если говорить обо всех микроконтроллерах EFM8 Bee, то в целом можно отметить, что «начинка» кристаллов всех серий достаточно насыщенна, в чем наглядно можно убедиться в сводной таблице под спойлером.
          Сводная таблица EFM8
          Сводная таблица EFM8
          Сводная таблица EFM8

          А еще есть ряд немаловажных особенностей, присущих микроконтроллерам всех серий:
          • наличие цифрового коммутатора (crossbar), обеспечивающего определенную гибкость при проектировании печатной платы за счет изменения назначения коммутации внутренней периферии на внешние выводы;
          • наличие блоков конфигурируемой логики, каждый из которых обеспечивает возможность реализации до 256 функций комбинаторной логики с подключением внешних сигналов и сигналов внутренней периферии;
          • уникальный 128-битный ID каждого процессора, упрощающий задачу сериализации изделий с использованием EFM8 Bee;
          • запрограммированный во Flash-память загрузчик, работающий по одному из имеющихся на кристалле интерфейсов.

          Микроконтроллеры серий Busy Bee и Sleepy Bee представлены как в промышленном температурном диапазоне, так и в автомобильном исполнении, соответствующие требованиям стандарта AEC-Q100.

          Корпуса весьма компактны — самый большой кристалл выпускается в 48-выводном корпусе QFP:
          Корпуса EFM8

          Разбивка корпусов по семействам и артикулам
          Корпуса с одинаковым названием (QFN24 и QFN32) представлены в разных размерах — отмечено отдельными цветами.
          Сводная таблица EFM8

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

          Почему EFM8 значительно дешевле C8051Fxxx, продолжением которых кристаллы EFM8 являются?


          Архитектурно EFM8 продолжают линейку C8051Fxxx, но производятся по проектным нормам — 0,18 мкм, т.е. меньшей чем C8051Fxxx, большинство которых производится по технологии 0,35 мкм. Тем не менее, по новым проектным нормам выпускаются серии C8051F7xxx, C8051F8xx, C8051F9xx, цены на которые ниже аналогичных в этом семействе.

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

          С чего начать?


          Начать освоение EFM8 Bee можно с этапа оценки ключевых возможностей выбранного микроконтроллера. Это можно осуществить на фирменной отладочной плате, которая выпускается для каждой серии EFM8. Стоимость этих плат колеблется в диапазоне от 45$ до 55$ c учетом НДС.

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

          В качестве программного средства для большинства этапов разработки с использованием EFM8 и их фирменных отладочных плат оптимально использовать интегрированную платформу разработки Simplicity Studio. Обзор её компонентов представлен в видео материалах на YouTube.

          Для оценки выбранного кристалла можно использовать любой из имеющихся ресурсов в Simplicity Studio:

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

          Какую среду разработки использовать? Есть ли бесплатный компилятор языка С?


          Предлагаемый производителем инструмент – упомянутая выше платформа разработки Simplicity Studio. После просмотра видео демонстраций начинать её освоение значительно проще.
          На день написания статьи доступны для скачивания на сайте производителя две версии Simplicity Studio: версии 3 и новой — версии 4. Версия 3 вызывает меньше трудностей при освоении, но её компоненты более не обновляются, а в версию 4 интегрируются все новые программные компоненты и документация. С каждым новым выпуском Simplicity Studio версии 4 трудностей в работе возникает всё меньше и меньше.

          После установки Simplicity Studio любой версии нужно доустановить требуемые компоненты как показано в видеороликах для версии 3 и для версии 4.

          В результате будет установлена Simplicity Studio со всеми компонентами, необходимыми для работы. Для EFM8 сюда будет входить профессиональный компилятор Keil, являющийся стандартом де-факто для архитектуры 8051, система команд которой заложена в ядро CIP-51 микроконтроллеров EFM8. Неограниченная лицензия для микроконтроллеров EFM8 Bee предоставляется бесплатно после регистрации на сайте Keil.

          Для получения лицензии в Simplicity Studio версии 3 необходимо выйти в форму регистрации после установки компонентов для EFM8 Bee в диалоговом окне “Setup tasks”. Этого может и не потребоваться, если до установки Simplicity Studio уже были установлены лицензии для Keil и они успешно «подтянулись» средой Simplicity Studio. В качестве проверки можно запустить компиляцию любого проекта и посмотреть выходную информацию компилятора – лицензия не требуется, если в окне Output среди последних строк будет запись: «C51 COMPILER V9.53.0.0 — SN: ххххх-хххххх».

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

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

          Какие есть программные библиотеки?


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

          При создании проекта с нуля или загрузки его из примера в Simplicity Studio необходимо выбрать SDK последней версии (если их уже несколько), тогда в дальнейшем для добавления в проект нужных модулей можно будет использовать возможности графической оболочки Simplicity Studio – расставив галочки напротив требуемых компонентов в свойствах проекта в разделе [C/C++ Build] > [Project Modules] — как показано на рисунке под спойлером.

          Добавление компонентов EFM8 SDK в проект.

          Все имеющиеся компоненты в выбранной версии SDK выводятся списком и добавляются/убираются галочками.


          Документация на EFM8 SDK представлена онлайн-версией на сайте devtools.silabs.com.

          Где найти документацию на микросхемы, отладочные средства, программное обеспечение?


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

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

          • в Simplicity Studio версии 3 доступ к документации и её поиск организован удобно, а сама документация размещается локально — на жестком диске компьютера. Для доступа к документации на выбранную микросхему и отладочных комплект, руководствам по применению и примерам программ предусмотрены соответствующие кнопки в главном окне Simplicity Studio. В этом способе доступа есть единственный минус – обновление документации в третьей версии с момента выхода четвертой версии Simplicity Studio более не происходит;
          • в Simplicity Studio версии 4 поиск любой документации осуществляется через поисковую строку в верхней части главного окна Simplicity Studio. Казалось бы простой путь, но он для многих не очевиден – окно поиска слабо выделяется среди остальных компонентов. Подробнее это можно увидеть в видеоролике от производителя. При первом открытии требуемого документа он скачивается из сети Интернет, а при последующем доступе – локальная версия.

          Как отладить проект на своём макете?


          Отладка проекта на собственном макете возможна с использованием фирменной отладочной платы для любой серии EFM8 либо c помощью внутрисхемного эмулятора/программатора USB Debug Adapter, стоимостью 55$, который уже много лет выпускается для кристаллов C8051Fxxx и у кого-то даже имеется в “закромах”.

          Правильное соединение сигнальных линий нужно делать согласно руководству по применению AN124.

          Здесь для отладки внешнего процессора необходимы сигналы отладочного интерфейса C2 — линии C2D, C2CK и GND. Вывод Reset в EFM8 всегда одновременно является сигнальной линией C2CK – так задуман интерфейс C2 из соображений экономии портов ввода/вывода. Для устойчивой работы интерфейса соединительные провода нужно делать как можно короче.

          Чтобы не изобретать питание для собственного макета, можно задействовать линии питания отладчиков – у USB Debug Adapter’а это 5В с 10-го контакта разъема, а у отладочной платы – 3,3В и 5В с разъема EXP.

          При отладке собственного макета с помощью фирменной отладочной платы необходимо сконфигурировать её для работы с внешним процессором – для этого нужно в утилите Kit Manager в Simplicity Studio версии 3 или главном окне Simplicity Studio версии 4 в разделе Debug Mode выставить режим OUT — при этом должен загореться светодиод рядом с разъемом DBG.

          Есть еще один, нестандартный путь для работы с микроконтроллерами EFM8 на собственном макете – для отладки использовать фирменную отладочную плату для микроконтроллеров EFM32, подключив сигналы C2D и C2CK микроконтроллера к 7 и 9 контактам разъема Debug Out отладочной платы, а также соединив линию питания и общий провод с линией VTARGET и GND этого разъема. Далее необходимо отладочную плату сконфигурировать в режим Debug: OUT и в свойствах соединения вручную указать целевой микроконтроллер.

          Фирменная отладочная плата работает некорректно. Мне не удается установить связь с процессором. Что делать?


          Первоочередной причиной любых проблем в работе отладочных плат для EFM8 является устаревшая «прошивка» отладочной платы. Для её обновления необходимо:
          • в версии 3 Simplicity Studio запустить Kit Manager и после предложения обновить прошивку платы согласиться;
          • в версии 4 Simplicity Studio в главном окне сверху будет выведена текущая версия прошивки и рядом ссылка для закачки последней её версии – после её закачки, при наличии новой версии прошивки, будет предложено её обновление на плате.

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

          В случае, если связь с платой есть, а с микроконтроллером на плате связь установить не удается, то причиной может быть работа программы в микроконтроллере, которая сразу после включения питания переводит его в состояние в котором процессор не может отвечать на запросы отладчика. Для примера, перевод микроконтроллера в глубокий режим сна либо неправильная настройка тактирования приводит к отказу работы отладчика с процессором. Для оживления микроконтроллера в таком случае понадобится USB Debug Adapter. Алгоритм действий описан в базе знаний на сайте community.silabs.com.

          В случае, если в Simplicity Studio с помощью USB Debug Adapter’а выполнить стирание не удается, то можно проделать это в приложении Flash Programming Utilities, где на закладке Flash Erase нужно выполнить операцию стирания всего содержимого Flash-памяти. Алгоритм работы функции стирания в этой программе работает надежнее, нежели в других приложениях для EFM8 и C8051Fxxx, и позволяет вывести микроконтроллер из глубокого «коматозного» состояния.

          У меня что-то [всё, ничего, не пойму что] не работает. Где искать ответы на вопросы?


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

          Как программировать микроконтроллеры EFM8 в серийном производстве?


          При выпуске приборов в небольшой серии микросхемы можно программировать в готовом изделии с использованием внутрисхемного эмулятора/программатора DEBUGADPTR1-USB, стоимостью 55$. В качестве программной оболочки можно использовать набор утилит Flash Programming Utilities либо Production Programmer. Flash Programming Utilities может работать в графическом режиме в готовой оболочке либо в режиме командной строки, что полезно в случаях создания сценариев программирования, помещаемых в .bat-файл.

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

          При объемах серийного производства, когда трудозатраты и стоимость накладных расходов на программирование превышают разумные значения, можно воспользоваться услугой программирования кристаллов на производстве Silicon Labs. Стоимость услуги в партиях от 5000 шт. составляет 0.06$/шт. — 0.1$/шт. с учетом НДС в зависимости от объема Flash-памяти.

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

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

          Это, пожалуй, весь список основных вопросов, которые возникают у большинства разработчиков, кто начинает работу с микроконтроллерами EFM8 Bee. Прочие вопросы можно адресовать нам — специалистам компании ЭФО либо найти ответы самостоятельно на сайте community.silabs.com.

          Комментарии (0)

            Let's block ads! (Why?)