Tagged: Проекты

28
Июн
2021

🥇 Не любите Kaggle? Вы просто не умеете его готовить

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

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

Kaggle это платформа, на которой собраны соревнования, курсы, базы данных, туториалы с кодом и обсуждения для решения реальных проблем с помощью Data Science. Существует несколько типов соревнований:

  • Проекты для обучения, предназначенные для новичков, например одни из самых известных Titanic-Machine Learning from Disaster и House Prices- Advanced Regression Techniques.
  • Проекты, в которых представлены данные для обучения и в которых ожидаемый результат известен как компании, так и участникам.
  • Соревнования с денежными призами, с помощью которых компании ищут лучшие решения своих проблем или новых сотрудников (в данном случае результат обычно известен только компании). По мере того, как участники загружают свои материалы, Kaggle делится в режиме реального времени распределением результатов каждой из команд в списке лидеров.

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


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

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

Изучите данные

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

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

Присоединитесь к сообществу

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

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

Построение моделей

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

Отправьте результаты

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

Как продолжить

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

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

Обзор последних соревнований


SIIM-FISABIO-RSNA COVID-19 Detection

Дедлайн для регистрации команд: 2 августа 2021 г.

Дата окончания: 9 августа 2021 г.

Призы: 1 место – $30,000, 2 место – $20,000, 3 место – $10,000, специальный приз для студенческой команды.

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

Подробнее: https://www.kaggle.com/c/siim-covid19-detection

CommonLit Readability Prize

Дедлайн для регистрации команд: 26 июля 2021 г.

Дата окончания: 2 августа 2021 г.

Призы: 1 место – $20,000, 2 место – $15,000, 3 место – $10,000.

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

Подробнее: https://www.kaggle.com/c/commonlitreadabilityprize/overview/description

Google Smartphone Decimeter Challenge

Дедлайн для регистрации команд: 28 июля 2021 г.

Дата окончания: 4 августа 2021 г.

Призы: 1 место – $5,000, 2 место – $3,000, 3 место – $2,000.

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

Подробнее: https://www.kaggle.com/c/google-smartphone-decimeter-challenge

SETI Breakthrough Listen – E.T. Signal Search

Дедлайн для регистрации команд: 21 июля 2021 г.

Дата окончания: 28 июля 2021 г.

Призы: 1 место – $6,000, 2 место – $5,000, 3 место – $4,000.

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

Подробнее: https://www.kaggle.com/c/seti-breakthrough-listen

Hungry Geese

Дедлайн для регистрации команд: 26 июля 2021 г.

Дата окончания: 26 июля 2021 г.

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

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

Подробнее: https://www.kaggle.com/c/hungry-geese/overview/prizes

***

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

01
Июн
2021

🎮 Разработка игр Unreal Engine 4: 10 советов начинающим

Изучения игрового движка Unreal Engine 4 с нуля – задача не из простых. Разбираемся, на чем следует сосредоточиться в первую очередь.

Движок Unreal Engine 4 – довольно сложная программа для создания игр, кинематографических сред и визуализаций. Несмотря на обилие документации, руководств и туториалов, новичку не всегда ясно, с чего начать ее изучение. Разберемся, на каких моментах следует сосредоточиться в первую очередь.

1. Установите UE 4


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

Рекомендуемая конфигурация:

  • Настольный ПК или Mac;
  • Операционная система: Windows 7 64-bit или Mac OS X 10.9.2 и выше;
  • Процессор: Intel или AMD с тактовой частотой 2.5 ГГц и выше
  • Видеокарта: NVIDIA GeForce 470 GTX или AMD Radeon 6870 HD и более производительные:
  • Оперативная память: 8 ГБ.

Минимальные требования гораздо ниже благодаря гибкой настройке графики.

Другие доступные платформы: Linux, iOS и Android. Имеется встроенная поддержка VR для Oculus Rift, поддержка Xbox One и PlayStation 4.

2. Определите цель изучения движка

Определитесь, что вы хотите сделать при помощи игрового движка. Для чего собираетесь изучить UE4? Вариантов использования масса, но наиболее популярные желания новичков выделить нетрудно:

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

3. Составьте план проекта (опишите этапы создания игры в UE4)


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

  1. Разработка основной идеи. Сюжет.
  2. Концепт-арт: визуальный стиль игры (рисунки, цифровая живопись, фотоотсылки).
  3. Концепция игрового процесса: как будет проходить игра, игровая механика.
  4. Создание прототипа игрового процесса (Blueprint или C++): простая программа с интегрированной базовой механикой и элементами-заполнителями.
  5. Доработка механики (создателю всегда есть что добавить).
  6. Создание трехмерной статической сетки (3D-модели, UV-развертка, текстурирование, материалы, экспорт и импорт).
  7. Работа с анимацией и эффектами.
  8. Дизайн уровней (прототипирование BSP, скрипты, ИИ, игровое тестирование, детализация, освещение).
  9. Оптимизация и производительность.
  10. Упаковка и релиз.
Многие из этих шагов пересекутся во время производства, а тестирование и исправление ошибок будут фоновым этапом разработки на протяжении всего проекта.

4. Определите этапы создания среды в UE4

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

  1. Создание 3D-модели: высокополигональная и низкополигональная сетки.
  2. Оптимизация текстур.
  3. Создание LOD (уровня детализации).
  4. Разработка собственных коллизий.
  5. Экспорт пакета 3D-моделирования.
  6. Импорт статических мешей (базовых единиц, используемых для создания геометрии мира).
  7. Экспорт и импорт всех текстур и материалов в UE4.
  8. Разукрашивание текстур.
  9. Создание прототипа.
  10. Настройка Blueprint для игровой механики (при необходимости).
В зависимости от среды, некоторые действия из этого списка могут не потребоваться.

5. Изучите основные понятия и операции

Чтобы приступить к разработке первого проекта, вам необходимо освоить базовые вещи:

  1. Работу с навигацией в окне просмотра.
  2. Использование Content Browser.
  3. Работу с объектами и статическими сетками.
  4. Использование BSP для блокировки макета уровня.
  5. Вставку и использование источников света (направленный свет, прожекторы, точечные светильники).
  6. Управление сценой.
  7. Работу с Lightmass Importance Volume, Player Start, Fog.
  8. Масштаб и пропорции.
  9. Тестирование из редактора.

Изучите основные понятия (термины):

  1. Мир – список загружаемых в игру уровней.
  2. Уровень – определяемая пользователем зона игровых действий.
  3. Объекты – базовые строительные блоки Unreal Engine. Через них реализована вся функциональность движка.
  4. Актер – любой Объект, помещенный на уровень и поддерживающий 3D-преобразования (перемещение, вращение, масштабирование).
  5. Пешка – подкласс Актеров, управляемых игроком или искусственным интеллектом (ИИ).
  6. Персонаж – подкласс Пешек, управляемых игроком.
  7. Классы описывают поведение и свойства конкретных Объектов и Актеров, используемых в игре.
  8. Компоненты – добавляемая Актеру функциональность.

6. Главное – режим!


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

Важно: Ключом к изучению любого игрового движка (особенно UE4) является установка добровольных ограничений. Не переусердствуйте со временем занятий и объемом материала, чтобы не перегореть на старте!

7. Начните с малого

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

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

8. Изучите шаблоны

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

Доступно более 10 вариантов: «Шутер от первого лица», «Шутер от третьего лица», «Сверху вниз», «Шаблон с боковой прокруткой» и др. Использование любого из них даст вам понимание базовой игровой механики, а добавив собственные изменения, вы можете развить функциональность. Не бойтесь экспериментов, тренируйте свои навыки и набирайтесь опыта!

9. Освойте Blueprint


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

Изучите базовые функции Blueprint для создания интерактивных элементов игрового процесса:

  • Перемещение платформ;
  • Открытие и закрытие дверей;
  • Включение и выключение света;
  • Причина и следствие (взаимодействие с предметами в игре);
  • Активация определенных событий или действий при загрузке уровня или при появлении игрока;
  • Добавление взаимодействия с помощью кнопки или текста на экране.
Blueprint чрезвычайно эффективен, поэтому его необходимо изучить всем начинающим разработчикам и геймдизайнерам. Если вы хотите стать художником по игровому окружению, дополнительно потребуется пакет 3D-моделирования (Maya LT, Maya, 3dsMax, Modo, Blender). Дизайнеру уровней, программисту или художнику по текстурам он не особо нужен.

10. Используйте интернет-ресурсы для обучения

В процессе изучения Unreal Engine 4 у вас наверняка возникнут вопросы. Ответы на них можно искать не только в документации:

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

***

На Unreal Engine 4 сделаны многие современные игры, поэтому движок однозначно рекомендован к изучению всем интересующимся геймдевом. На самостоятельное освоение всех его возможностей потребуются не один год, но есть и более короткий путь. Обратите внимание на курс факультета разработки игр на Unreal Engine 4 образовательной онлайн-платформы GeekBrains. Вы освоите сам движок, научитесь программировать на Blueprints и C++ и сможете самостоятельно создавать игры с нуля. Занятия ведут эксперты-разработчики российских технологических компаний, а успешно окончившие курс студенты получат диплом о профессиональной переподготовке, несколько проектов в портфолио и помощь в трудоустройстве.

30
Мар
2021

🤖 Применение искусственного интеллекта для общественного блага

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

Что…

21
Фев
2021

🐍 Примеры использования Python, вдохновляющие на его изучение

С помощью Python профессиональные разработчики и любители решают множество задач. В Netflix он применяется для трансляции видео, поддерживает обмен фотографиями в Instagram и помогает НАСА в освоении космоса.

30
Окт
2020

🦋 7 мифов о профессии тестировщика

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

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

Иллюстрация с pixabay.com
Иллюстрация с pixabay.com

Миф 1. Тестировщик – как программист, только похуже.

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

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

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

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

Миф 2. Тестировщики – самые бесполезные участники процесса. Они только ищут ошибки, а значит можно работать без них.

Инженер по QA – не стартовая площадка в ИТ с ростом до более важной позиции. Это сложная и самодостаточная профессия, требующая таланта и особого склада ума.

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

Инженер по QA – это буфер между разработкой и пользователем. Он понимает обе стороны и с каждой говорит на ее языке.

Иллюстрация с pixabay.com
Иллюстрация с pixabay.com

Миф 3. Программист vs тестировщик.

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

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

Миф 4 . Работа тестировщика лишена творчества.

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

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

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

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

Миф 5. Тестировщики зарабатывают меньше всех в ИТ.

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

Иллюстрация с pixabay.com
Иллюстрация с pixabay.com

Миф 6. Тестировщику некуда расти. Тупиковая ветвь карьеры.

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

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

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

Миф 7. Если программа работает плохо, виноват тестировщик.

В QA у каждого своя роль, от которой зависит результат. Невозможно ответственность за проект отдать только этапу тестирования.

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

***

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

27
Окт
2020

☕ Начало работы с JavaFX на Raspberry Pi

Raspberry Pi идеально подходит для любителей поэкспериментировать с электронными компонентами. Если объединить его с инструментами Java-разработчика, вы откроете для себя новый мир.

Недорогой одноплатный компьютер Raspberry Pi отлично работает с Java, отчего hardware-разработка становится не сложнее классической разработки ПО.

***

Из этой статьи вы узнаете, как разработать приложение на JavaFX в
стиле дашборд, используя библиотеку
TilesFX.

На рис. 1 изображен
пользовательский интерфейс (далее UI).

<b>Рис. 1</b> UI приложения
Рис. 1 UI приложения

Также вы можете ознакомиться
с видео
, на
котором показана работа приложения на Raspberry Pi 3B+ и функциональность интерфейса с тачскрином.

Приведенный код и рассмотренные методы применимы только к микрокомпьютерам Raspberry Pi на чипах ARM v7 и ARM
v8. В разделе
спецификаций плат Raspberry Pi на Википедии вы найдете типы поставляющихся с этими процессорами плат:

Модель A+,
версия 3;

Модель B, версии 2, 3 и 4;

Вычислительный модуль (Compute Module), версия
3.

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

Raspberry Pi 3 Модель B+;

SD карта 32 GB (или более) на ОС Raspberry Pi
(бывш. Raspbian);

Монитор, клавиатура и мышь;

Светодиод и резистор (для большинства подойдет
330 Ом);

Кнопочный переключатель;

Датчик расстояния HC-SR04;

Беспаечная макетная плата и провода.

Подготовка платы Raspberry Pi

Если вы работаете Raspberry Pi впервые, подготовьте карту SD с операционной системой. В проекте
используется Full ОС Raspbian (полная версия). Загрузите инструмент
Imager
. Для своей работы я взял версию Raspberry Pi Imager 1.2 от марта 2020 г. (рис. 2 и рис. 3). Убедитесь,
что устанавливаете полную версию.

<b>Рис. 2 </b>Страница скачивания инструмента Imager
Рис. 2 Страница скачивания инструмента Imager
<b>Рис.3</b> Выберите полную версию (Raspbian Full)
Рис.3 Выберите полную версию (Raspbian Full)

Как только SD карта будет готова,
вставьте ее в плату Raspberry Pi, запустите операционную систему и выполните
действия по настройке и подключению к вашей сети Wi-Fi.

Установка JDK (Java Development Kit) с помощью JavaFX

В примечаниях к релизу Raspbian
указано, что используемая мной версия ОС включает OpenJDK 11.

        2019-06-20:
* Based on Debian Buster
* Oracle Java 7 and 8 replaced with OpenJDK 11

    

Java-версия:

        $ java -version
openjdk version "11.0.3" 2019-04-16 
OpenJDK Runtime Environment (build 11.0.3+7-post-Raspbian-5) 
OpenJDK Server VM (build 11.0.3+7-post-Raspbian-5, mixed mode)

    

Теперь плата готова к запуску любых
приложений на основе Java 11. Однако JavaFX больше не является частью JDK
(начиная с Java 11), и запустить JavaFX-программу на Raspberry Pi «из коробки» не
получится.

К счастью, BellSoft разработала Liberica JDK. Предназначенная для Raspberry Pi версия включает JavaFX,
поэтому вы сможете запускать упакованное приложение JavaFX с помощью команды
java -jar yourapp.jar. Используйте ссылку для загрузки от BellSoft, чтобы установить
альтернативную JDK:

        $ cd /home/pi 
$ wget https://download.bell-sw.com/java/13/bellsoft-jdk13-linux-arm32-vfp-hflt.deb 
$ sudo apt-get install ./bellsoft-jdk13-linux-arm32-vfp-hflt.deb 
$ sudo update-alternatives --config javac 
$ sudo update-alternatives --config java

    

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

        $ java --version 
openjdk version "13-BellSoft" 2019-09-17 
OpenJDK Runtime Environment (build 13-BellSoft+33) 
OpenJDK Server VM (build 13-BellSoft+33, mixed mode)

    

На моей тестовой плате хранятся
различные версии Liberica JDK. Переключаться между ними несложно с
помощью команды
update-alternatives. (см. Рис.4)

<b>Рис. 4 </b>Переключение между версиями Liberica JDK
Рис. 4 Переключение между версиями Liberica JDK

В папке исходного кода Chapter_04_Java/scripts на GitHub расположены установочные скрипты
различных версий Liberica JDK. Они содержат ссылки для скачивания. (см. Рис. 5)

<b>Рис. 5</b> Установочные скрипты различных версий Liberica JDK
Рис. 5 Установочные скрипты различных версий Liberica JDK

Различные схемы нумерации Raspberry Pi

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

Нумерация Header Pin.
Это логическая нумерация заголовка платы. Один ряд содержит четные пины, другой – нечетные.(см. Рис. 6)

<b>Рис. 6</b> Нумерация пинов заголовка платы
Рис. 6 Нумерация пинов заголовка платы

Нумерация BCM. Относится
к номеру канала Broadcom – нумерации внутри микросхемы, используемой на
Raspberry Pi.

Нумерация WiringPi.
Wiring Pi
– основной фреймворк, используемый Pi4J (в проекте он применяется в качестве
библиотеки в Java) для управления GPIO. Причина другой схемы нумерации
кроется в истории платы. Когда еще велась разработка первых моделей Raspberry Pi,
предполагалось всего восемь контактов. В результате дальнейшего развития
микрокомпьютера и добавления дополнительных контактов, нумерацию в WiringPi расширили, чтобы можно было на них ссылаться.

Чтобы Java разработчикам было проще
понять разницу между различными типами заголовков, пинами и функциями, я
разработал небольшую библиотеку, расположенную в репозитории Maven по адресу
be.webtechie.pi-headers. Используя ее и небольшое приложение JavaFX, я
сделал вспомогательную таблицу (см. Рис.
7
), которая упрощает поиск и сопоставление номеров с соответствующими им
пинами на плате. Более
подробную информацию вы найдете по ссылке Raspberry
Pi history, versions, pins and headers as a Java Maven library
.”

<b>Рис. 7 </b>Сопоставление номеров с пинами на плате
Рис. 7 Сопоставление номеров с пинами на плате

Подключение оборудования

Давайте подключим оборудование, чтобы использовать часть мощностей платы Pi: светодиод,
кнопку и датчик расстояния. См. Табл. 1,
Рис. 8, Рис. 9.

<b>Табл. 1 </b>Сопоставление пинов с соответствующими устройствами
Табл. 1 Сопоставление пинов с соответствующими устройствами
<b>Рис. 8</b> Подключение проводов
Рис. 8 Подключение проводов
<b>Рис. 9</b> Схема подключения
Рис. 9 Схема подключения

На рис. 10 изображена система с использованием моста на макетной плате RasPiO, что упрощает поиск правильного пина. Разъем моста помещает номера
BCM в логическом порядке, но я все еще использую отдельную макетную плату,
чтобы было немного больше места.
Portsplus предлагает аналогичное удобное решение.

<b>Рис. 10 </b>Фото системы с использованием моста макетной платы RasPiO
Рис. 10 Фото системы с использованием моста макетной платы RasPiO

Чтобы проверить, подключен ли
светодиод в правильном положении с учетом его полярности, отсоедините кабель
между светодиодом и пином GPIO (оранжевый кабель на рис. 10) и подключите его непосредственно к контакту 3,3 В (или к
плюсу на плате). Если светодиод не загорится, вам нужно поменять его положение.

Проверьте светодиод и кнопку через терминал

Чтобы проверить соединение,
запустите команду
gpio через
терминал.

Примечание: Если вы работаете с платой Raspberry Pi 4,
обязательно используйте версию 2.52 утилиты gpio.
Поскольку внутренняя проводка процессора на плате Pi 4
отличается от предыдущих моделей, при необходимости доступно обновление для
утилиты. Проверьте свою версию с помощью команды gpio -v через терминал и, если
нужно, установите новую с помощью следующих команд:

        $ gpio -v
gpio version: 2.50
$ cd /tmp
$ wget https://project-downloads.drogon.net/wiringpi-latest.deb
$ sudo dpkg -i wiringpi-latest.deb
$ gpio -v
gpio version: 2.52

    

Включить (1) и
выключить (0) светодиод:

        $ gpio mode 29 out
$ gpio write 29 1
$ gpio write 29 0

    

Состояние кнопки
(1=нажата, 2=не нажата) 27 пина WiringPi

        $ gpio mode 27 in 
$ gpio read 27
1

    

Переключение светодиода с помощью Java

Начинается самое интересное! Следующий код настраивает 29 пин WiringPi и 10 раз переключает его
между включением и выключением с интервалом в 500 мс, используя ту же команду,
которую я применял в терминале. Создайте файл под именем
HelloGpio.java со следующим содержанием:

        public class HelloGpio {
    public static void main (String[] args) {
        System.out.println("Hello Gpio");

        try {
            Runtime.getRuntime().exec("gpio mode 29 out");

            var loopCounter = 0;
            var on = true;

            while (loopCounter < 10) {
                System.out.println("Changing LED to " + (on ? "on" : "off"));
                Runtime.getRuntime().exec("gpio write 29 " + (on ? "1" : "0"));

                on = !on;

                Thread.sleep(500);

                loopCounter++;
            }
        } catch (Exception ex) {
            System.err.println("Exception from Runtime: " + ex.getMessage());
        }
    }
}

    

Поскольку код будет использовать Java 11 (или выше), файл
Java может быть выполнен без компиляции:

        $ java HelloGpio.java
Hello Gpio
Changing LED to on
Changing LED to off
Changing LED to on
…

    

Использование датчика движения

Написанное для этого
блока приложение использует обычный ультразвуковой датчик расстояния, который можно найти
во многих стартовых наборах Arduino и Pi. Это модуль под названием HC-SR04;
дополнительную информацию и примеры вы можете найти в интернете. Модулю
требуются входные и выходные GPIO-соединения. Датчик работает по той же
схеме, что и система, используемая летучей мышью для полета в темноте: он использует отражение ультразвука для расчета расстояния до
объекта.

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

  1. Модуль нужно запитать на 5 V;
  2. Приложению нужно установить вывод trig в положение high как минимум на 10 мкс;
  3. Модуль посылает несколько (обычно восемь) сигналов 40 кГц и определяет, когда сигнал принимается обратно;
  4. Вывод echo устанавливается в положение high на ту же продолжительность, что и время, необходимое для возврата ультразвука к датчику;
  5. Приложение измеряет длительность положения high echo-вывода, чтобы рассчитать расстояние на основе скорости звука.

Готовое приложение

Запуск одного файла Java хорошо для
тестирования системы, но это только первый шаг. В приложении используется
библиотека
Pi4J
для объединения Java и портов GPIO
на плате Raspberry Pi. Pi4J должен быть установлен на Raspberry Pi и может быть
интегрирован в приложение Java с Maven. Полный исходный код примера вы можете найти на
GitHub.

Следующие зависимости Maven указаны
в файле POM:

Для JavaFX,
расширенная зависимость javafx-web, которая включает:

javafx-controls – основу для приложения JavaFX;

Веб-компоненты,
необходимые для TilesFX.

Логирование;

TilesFX для
панели инструментов Tiles;

Pi4J для
использования портов GPIO.

        <dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-web</artifactId>
    <version>11.0.2</version>
</dependency>

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>eu.hansolo</groupId>
    <artifactId>tilesfx</artifactId>
    <version>11.13</version>
</dependency>

<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-core</artifactId>
    <version>1.2</version>
</dependency>

    

Вот классы для взаимодействия с
оборудованием.

Класс GpioHelper. В нем сгруппированы функции, связанные с портами GPIO. Код начинается с
определения контактов, к которым подключены компоненты оборудования, и
инициализации Pi4J GpioController. Расширенная функциональность обрабатывается в
отдельных классах: ButtonChangeEventListener и DistanceSensorMeasurement
(описаны вкратце). Дополнительные методы и геттеры будут использоваться в UI
позже.

        public class GpioHelper {

    private static final Logger logger = LogManager.getLogger(GpioHelper.class);

    /**
     * The pins being used in the example.
     */
    private static final Pin PIN_LED = RaspiPin.GPIO_29;        // BCM 21, Header pin 40
    private static final Pin PIN_BUTTON = RaspiPin.GPIO_27;     // BCM 16, Header pin 36
    private static final Pin PIN_ECHO = RaspiPin.GPIO_05;       // BCM 24, Header pin 18
    private static final Pin PIN_TRIGGER = RaspiPin.GPIO_01;    // BCM 18, Header pin 12

    /**
     * The connected hardware components.
     */
    private GpioController gpioController;

    /**
     * The Pi4J GPIO input and outputs.
     */
    private GpioPinDigitalOutput led = null;

    /**
     * The GPIO handlers.
     */
    private ButtonChangeEventListener buttonChangeEventListener = null;
    private DistanceSensorMeasurement distanceSensorMeasurement = null;

    /**
     * Constructor.
     */
    public GpioHelper() {
        try {
            // Initialize the GPIO controller
            this.gpioController = GpioFactory.getInstance();

            // Initialize the LED pin as a digital output pin with an initial low state
            this.led = gpioController.provisionDigitalOutputPin(PIN_LED, "RED", PinState.LOW);
            this.led.setShutdownOptions(true, PinState.LOW);

            // Initialize the input pin with pulldown resistor
            GpioPinDigitalInput button = gpioController
                    .provisionDigitalInputPin(PIN_BUTTON, "Button", PinPullResistance.PULL_DOWN);

            // Initialize the pins for the distance sensor and start thread
            GpioPinDigitalOutput trigger = gpioController.provisionDigitalOutputPin(PIN_TRIGGER, "Trigger", PinState.LOW);
            GpioPinDigitalInput echo = gpioController.provisionDigitalInputPin(PIN_ECHO, "Echo", PinPullResistance.PULL_UP);
            this.distanceSensorMeasurement = new DistanceSensorMeasurement(trigger, echo);
            ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
            executorService.scheduleAtFixedRate(this.distanceSensorMeasurement, 1, 1, TimeUnit.SECONDS);

            // Attach an event listener
            this.buttonChangeEventListener = new ButtonChangeEventListener();
            button.addListener(this.buttonChangeEventListener);
        } catch (UnsatisfiedLinkError | IllegalArgumentException ex) {
            logger.error("Problem with Pi4J! Probably running on non-Pi-device or Pi4J not installed. Error: {}",
                    ex.getMessage());
        }
    }

    public GpioController getGpioController() {
        return this.gpioController;
    }

    /**
     * Set the state of the LED.
     *
     * @param on Flag true if the LED must be switched on
     */
    public void setLed(boolean on) {
        if (this.led != null) {
            if (on) {
                this.led.high();
            } else {
                this.led.low();
            }
        }
    }

    /**
     * Get the data from the button.
     *
     * @return {@link XYChart.Series}
     */
    public XYChart.Series<String, Number> getButtonEvents() {
        if (this.buttonChangeEventListener != null) {
            return this.buttonChangeEventListener.getData();
        } else {
            return new Series<>();
        }
    }

    /**
     * Get the data from the distance measurement.
     *
     * @return {@link XYChart.Series}
     */
    public XYChart.Series<String, Number> getDistanceMeasurements() {
        if (this.distanceSensorMeasurement != null) {
            return this.distanceSensorMeasurement.getData();
        } else {
            return new Series<>();
        }
    }
}

    

Класс
ButtonChangeEventListener.
Поскольку этот класс реализует Pi4J
GpioPinListenerDigital, он может обрабатывать изменение кнопки и сохранять
изменение в XYChart.Series с отметкой времени.

        @Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
    var timeStamp = LocalTime.now().format(DateTimeFormatter.ofPattern("HH.mm.ss"));
    this.data.getData().add(new XYChart.Data<>(timeStamp, event.getState().isHigh() ? 1 : 0));

    logger.info("Button state changed to {}", event.getState().isHigh() ? "high" : "low");
}

    

Класс DistanceSensorMeasurement. Этот класс является Runnable. Он добавляет отмеренное
расстояние к аналогичной серии данных с отметкой времени для каждого пробега.

        @Override
public void run() {
    // Set trigger high for 0.01 ms
    this.trigger.pulse(10, PinState.HIGH, true, TimeUnit.NANOSECONDS);

    // Start the measurement
    while (this.echo.isLow()) {
        // Wait until the echo pin is high, indicating the ultrasound was sent
    }
    long start = System.nanoTime();

    // Wait until measurement is finished
    while (this.echo.isHigh()) {
        // Wait until the echo pin is low,  indicating the ultrasound was received back
    }
    long end = System.nanoTime();

    // Output the distance
    float measuredSeconds = getSecondsDifference(start, end);
    int distance = getDistance(measuredSeconds);
    logger.info("Distance is: {}cm for {}s ", distance, measuredSeconds);

    var timeStamp = new SimpleDateFormat("HH.mm.ss").format(new Date());
    this.data.getData().add(new XYChart.Data<>(timeStamp, distance));
}

    

UI. Благодаря
TilesFX приложение в стиле дашборда может быть создано быстро. Полное
построение интерфейса выполняется в классе DashboardScreen.java. В следующем
фрагменте кода показана кнопка переключателя для включения и выключения
светодиода:

        var ledSwitchTile = TileBuilder.create()
        .skinType(SkinType.SWITCH)
        .prefSize(200, 200)
        .title("LED")
        .roundedCorners(false)
        .build();

ledSwitchTile.setOnSwitchReleased(e -> gpioHelper.setLed(ledSwitchTile.isActive()));

    

Чтобы показать измерение расстояния, я использую tile типа SMOOTHED_CHART, который в свою очередь использует XYChart.Series из доступного через GpioHelper DistanceSensorMeasurement.

        var distanceChart = TileBuilder.create()
        .skinType(SkinType.SMOOTHED_CHART)
        .prefSize(500, 280)
        .title("Distance measurement")
        //.animated(true)
        .smoothing(false)
        .series(gpioHelper.getDistanceMeasurements())
        .build();

    

Класс приложения. Теперь все
элементы готовы к объединению в класс приложения JavaFX. Ниже описано, как
инициализировать GpioHelper и использовать его для инициализации
DashboardScreen, а также есть дополнительный код, позволяющий красиво закрыть
приложение.

        public class DashboardApp extends Application {

    private GpioHelper gpioHelper;

    @Override
    public void start(Stage stage) {
        Platform.setImplicitExit(true);

        this.gpioHelper = new GpioHelper();

        var scene = new Scene(new DashboardScreen(this.gpioHelper), 640, 480);
        stage.setScene(scene);
        stage.setTitle("JavaFX demo application on Raspberry Pi");
        stage.show();

        // Make sure the application quits completely on close
        stage.setOnCloseRequest(t -> CleanExit.doExit(this.gpioHelper.getGpioController()));
    }

    public static void main(String[] args) {
        launch();
    }

}

    

Запуск приложения на одноплатном компьютере
Raspberry Pi

Вы можете запустить приложение на
своем ПК через среду IDE, и UI отобразится, но большинство возможностей будут
недоступны, потому что необходимы Pi4J и аппаратные компоненты. Перейдем
к Raspberry Pi! Сначала вам нужно установить Pi4J. Это можно сделать с помощью
однострочной команды:

$ curl -sSL
https://pi4j.com/install | sudo bash

Финальный шаг – загрузить
скомпилированный файл JAR с вашего ПК на плату Pi, что можно сделать с помощью
SSH, USB-накопителя, загрузки или SD-карты. Поместите файл в /home/pi и
запустите его с помощью java -jar:

        $ cd /home/pi
$ ls *.jar
javamagazine-javafx-example-0.0.1-jar-with-dependencies.jar
$ java -jar javamagazine-javafx-example-0.0.1-jar-with-dependencies.jar
INFO  be.webtechie.gpio.DistanceSensorMeasurement - Distance is: 103cm for 0.006021977s 
INFO  be.webtechie.gpio.DistanceSensorMeasurement - Distance is: 265cm for 0.01544218s 
INFO  be.webtechie.gpio.DistanceSensorMeasurement - Distance is: 198cm for 0.011520567s 
INFO  be.webtechie.gpio.ButtonChangeEventListener - Button state changed to high
INFO  be.webtechie.gpio.ButtonChangeEventListener - Button state changed to low

    

Сначала на экране отобразятся логи,
а чуть позже откроется экран JavaFX. Диаграмма расстояний получает новое
значение каждую секунду, а диаграмма кнопки обновляется при каждом ее нажатии.
Светодиод можно переключать с помощью кнопки переключения на экране в одной из
плиток. (см. Рис. 11)

<b>Рис. 11 </b>Фото запущенного приложения вместе с Raspberry Pi и другими компонентами
Рис. 11 Фото запущенного приложения вместе с Raspberry Pi и другими компонентами

Заключение

Как только вы узнаете, какую версию
Java нужно использовать на Pi, вы можете очень быстро начать работу с простыми
тестовыми программами и расширить их с помощью пользовательского интерфейса
JavaFX. Создание сложного приложения требует дополнительных усилий, чтобы настроить
все в вашей среде IDE и иметь возможность тестового запуска. Это позволяет вам легко разрабатывать программы на ПК и выполнять их на Pi.

Текст опубликован в переводе. Автор оригинальной статьи Frank Delporte.

***

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

30
Сен
2020

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

Согласно отчету Gartner за 2019 год, около 80 процентов всех проектов в сфере Data Science потерпели неудачу. По прогнозам на 2022 год, 85% проектов будут выдавать ошибочные результаты из-за искаженных данных, проблем с алгоритмами или с ответственными за управление командами. Только 20% аналитических инсайтов принесут бизнесу пользу. Специалисты Harvard Business Review провели исследование, результаты которого показали, что основная причина провала аналитических инициатив заключается в недостаточной организационной согласованности между командой разработки и бизнесом. Это одна из многих проблем проектов, которые скорее всего потерпят неудачу и не будут реализованы.

Мы описали 5 главных причин, почему проект может потерпеть крах и указали возможные пути решения потенциальных проблем. Если вы не знакомы с Data Science и хотите овладеть профессией с нуля, рекомендуем прочесть статью «Научиться Data Science онлайн».

Неопределенные цели и ожидания

<a href="https://www.learnupon.com/blog/what-is-customer-training/" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник
Почему проекты с большими данными терпят неудачу? Во-первых многим руководителям не хватает видения и предприятия путаются в больших данных. Большинство думает о числах или черных ящиках NLP, которые делают простой интеллектуальный анализ текста и другие виды распознавания образов.

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

Проблемы с данными

<a href="https://www.elmhurst.edu/blog/future-of-data-science/" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

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

Если вы соберете вместе большой объем информации, получите “data dump”. Я называю это мусорной свалкой. Мусорки – не самое лучшее место для поиска решений. Я всегда говорю клиентам, что сначала нужно решить какую-то отдельную бизнес-задачу… Затем посмотреть на качество доступных данных и устранить потенциальные проблемы.
<a href="https://magenticians.com/magento-memes/amp/" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

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

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

Отсутствие понимания бизнес-задачи

<a href="https://www.igh.com/category/events/announcement-header/analytics/" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

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

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

  1. Влияние на бизнес;
  2. Срочность;
  3. Осуществимость.

Далее выберите наиболее важные бизнес-задачи и разработайте решение с помощью технологий Data Science.

Некорректность выбора модели машинного обучения

<a href="https://blog.deiser.com/en/how-to-build-real-time-confluence-reports-from-jira-project-data" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

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

Неэффективная работа команды Data Science

<a href="https://cssh.northeastern.edu/bari/projects/" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Коммуникация

Неспособность понять реальную бизнес-проблему часто происходит из-за плохой коммуникации между командой Data Scientist и заинтересованными сторонами из бизнеса. Одна из проблем, с которыми сталкиваются консультанты Data Science заключается в неспособности команды объяснить ценность проекта. Для этого нужны… данные! Предоставьте руководителям показатели сэкономленных ресурсов, полученные конкурентные преимущества и т. д. Если намерения проекта не согласованы с целями руководителей, он обречен на провал.

Навыки команды

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

Члены команды

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

Успешная модель команды состоит из:

  1. Людей с высокими техническими знаниями в области Data Science и Big Data;
  2. Экспертов в предметной области, которые могут предоставить информацию в нужный момент;
  3. Разбирающихся в бизнесе людей, которые сумеют превратить идею в имеющий практическую пользу проект, а также обладают навыками презентации и storytelling;
  4. Подрядчиков и консультантов, которые должны привнести в команду другой подход и опыт.

Заключение

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

***

Для тех, кто только начинает карьеру в Data Science и не имеет опыта, мы рекомендуем курс Факультета Искусственного интеллекта. Его особенность заключается в проектно-ориентированном обучении, во время которого вы сможете на практике понять, как работает команда и как избежать ошибок. Программа курса включает основательную математическую подготовку, занятия по программированию и машинному обучению, а также работу над бизнес-проектами.

26
Авг
2020

Идея для проекта выходного дня – собираем калькулятор на React Hooks и Context API. Осваиваем эти интересные технологии в деле. Приводим пример возможной реализации проекта.

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

Внешний вид калькулятора
Внешний вид калькулятора

Приступим!

Для начала запустим стандартный create-react-app:

        npx create-react-app calculator
cd calculator
npm start
    

Файловая структура и CSS

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

        src
├── App.js
├── index.js
└── components
    ├── BackButton.js
    ├── Calculator.js
    ├── ClearButton.js
    ├── Display.js
    ├── EqualButton.js
    ├── FunctionButton.js
    ├── NegativeButton.js
    ├── NumberButton.js
    ├── NumberProvider.js
    └── styles
        └── Styles.js
    

Если вы хотите точно
следовать примеру, нужно установить Styled Components для CSS:

        npm -i styled-components
    

Затем необходимо добавить Styled CSS в Styles.js.

Основная структура

Файл Calculator.js задает настройки экрана и клавиатуры.
Он содержит следующий код:

Calculator.js
        import React from 'react';
import NumberButton from './NumberButton';
import FunctionButton from './FunctionButton';
import ClearButton from './ClearButton';
import Display from './Display';
import EqualButton from './EqualButton';
import BackButton from './BackButton';
import NegativeButton from './NegativeButton';
import { CalculatorStyles } from './styles/Styles';

const Calculator = () => (
  <CalculatorStyles>
    <div className='display'>
      <h1>CALC-U-LATER</h1>
      <Display />
    </div>
    <div className='number-pad'>
      <ClearButton />
      <BackButton />
      <NegativeButton />
      <FunctionButton buttonValue='/' />
      <NumberButton buttonValue={7} />
      <NumberButton buttonValue={8} />
      <NumberButton buttonValue={9} />
      <FunctionButton buttonValue='*' />
      <NumberButton buttonValue={4} />
      <NumberButton buttonValue={5} />
      <NumberButton buttonValue={6} />
      <FunctionButton buttonValue='-' />
      <NumberButton buttonValue={1} />
      <NumberButton buttonValue={2} />
      <NumberButton buttonValue={3} />
      <FunctionButton buttonValue='+' />
      <div className='zero-button'>
        <NumberButton buttonValue={0} />
      </div>
      <NumberButton buttonValue='.' />
      <EqualButton />
    </div>
  </CalculatorStyles>
);

export default Calculator;
    

Каждый компонент кнопок следует одной базовой структуре. Нулевая кнопка лежит в отдельном div-блоке, так как мы используем для макета грид.

Кстати, о гридах
Если хотите узнать больше о CSS Grid, мы написали несколько статей на эту тему.

Обратите внимание, что свойство
buttonValue необходимо только для NumberButton и FunctionButton.

Создание Context API Provider

NumberProvider.js
это сердце приложения и место, где наши функции обретают жизнь. Здесь же используется
React Context API – отличный инструмент передачи данных между компонентами.

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

Предварительная версия NumberProvider.js
        import React from 'react';

export const NumberContext = React.createContext();

const NumberProvider = (props) => {
  const number = '0';
  return (
    <NumberContext.Provider
      value={{
        number,
      }}>
      {props.children}
    </NumberContext.Provider>
  );
};

export default NumberProvider;
    

Любое переданное значение теперь доступно всем вложенным компонентам. Так что есть всё необходимое для заполнения App.js:

App.js
        import React from 'react';
import Calculator from './components/Calculator';
import NumberProvider from './components/NumberProvider';

const App = () => (
  <NumberProvider>
    <Calculator />
  </NumberProvider>
);

export default App;
    

Используем Context Provider

Теперь добавим код для дисплея. Можно выводить значение, передав его в функцию useContext из
нового React Hooks API. Больше не нужно передавать проп через вложенные компоненты.

Предварительная версия Display.js
        import React, { useContext } from 'react';
import { NumberContext } from './NumberProvider';
import { DisplayStyles } from './styles/Styles';

const Display = () => {
  const { number } = useContext(NumberContext);
  return (
    <DisplayStyles>
      <h2>{number}</h2>
      <p>Enter Some Numbers</p>
    </DisplayStyles>
  );
};

export default Display;
    

Число, которое передано
на три уровня выше в NumberProvider, становится сразу же доступным компоненту Display при вызове useContext и передаче созданного нами NumberContext. Цифровой
дисплей теперь включен, работает и отображает number, исходно приравненное нулю.

Начинаем работать с Hooks

Хуки позволяют «облегчить» синтаксис класса и получить
состояние внутри функциональных компонентов. Добавим следующий код в NumberProvider.js, чтобы создать хук:

NumberProvider.js
        import React, { useState } from 'react';

export const NumberContext = React.createContext();

const NumberProvider = (props) => {
  const [number, setNumber] = useState('');

  const handleSetDisplayValue = (num) => {
    if (!number.includes('.') || num !== '.') {
      setNumber(`${(number + num).replace(/^0+/, '')}`);
    }
  };

  return (
    <NumberContext.Provider
      value={{
        handleSetDisplayValue,
        number,
      }}>
      {props.children}
    </NumberContext.Provider>
  );
};

export default NumberProvider;
    

Вместо написания класса
с состоянием мы разбиваем состояние и переносим каждую его часть в переменную number. Здесь же используется setNumber, действующая, как функция setState. Для инициализации используется useState.

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

Теперь мы можем вызвать функцию с помощью Context API в любом из вложенных компонентов.

NumberButton.js
        import React, { useContext } from 'react';
import { NumberContext } from './NumberProvider';

const NumberButton = ({ buttonValue }) => {
  const { handleSetDisplayValue } = useContext(NumberContext);
  return (
    <button type='button' onClick={() => handleSetDisplayValue(buttonValue)}>
      {buttonValue}
    </button>
  );
};

export default NumberButton;
    

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

Функции провайдера

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

  • handleSetDisplayValue: задает значение, выводимое на дисплей. Мы проверяем, что в числовой строке есть только один десятичный знак, и ограничиваем длину числа 8 символами. Он передает свойство buttonValue в NumberButton.js.
  • handleSetStoredValue: принимает строку и сохраняет ее, позволяя ввести другое число.
  • handleClearValue: сбрасывает всё в 0. Это «функция очистки», которая передается в ClearButton.js.
  • handleBackButton: позволяет удалять ранее введенные символы по одному, пока вы не вернетесь в 0. Код привязан к BackButton.js.
  • handleSetCalcFunction: срабатывает при выборе математической функции, передается в FunctionButton.js и в свойства buttonValue.
  • handleToggleNegative: оперирует отображаемыми или сохраненными значениями, передаваемыми в NegativeButton.js.
  • doMath: запускает выбранную математическую операцию.
NumberProvider.js
        import React, { useState } from 'react';

export const NumberContext = React.createContext();

const NumberProvider = (props) => {
  const [number, setNumber] = useState('');
  const [storedNumber, setStoredNumber] = useState('');
  const [functionType, setFunctionType] = useState('');

  const handleSetDisplayValue = (num) => {
    if ((!number.includes('.') || num !== '.') && number.length < 8) {
      setNumber(`${(number + num).replace(/^0+/, '')}`);
    }
  };

  const handleSetStoredValue = () => {
    setStoredNumber(number);
    setNumber('');
  };

  const handleClearValue = () => {
    setNumber('');
    setStoredNumber('');
    setFunctionType('');
  };

  const handleBackButton = () => {
    if (number !== '') {
      const deletedNumber = number.slice(0, number.length - 1);
      setNumber(deletedNumber);
    }
  };

  const handleSetCalcFunction = (type) => {
    if (number) {
      setFunctionType(type);
      handleSetStoredValue();
    }
    if (storedNumber) {
      setFunctionType(type);
    }
  };

  const handleToggleNegative = () => {
    if (number) {
      if (number > 0) {
        setNumber(`-${number}`);
      } else {
        const positiveNumber = number.slice(1);
        setNumber(positiveNumber);
      }
    } else if (storedNumber > 0) {
      setStoredNumber(`-${storedNumber}`);
    } else {
      const positiveNumber = storedNumber.slice(1);
      setStoredNumber(positiveNumber);
    }
  };

  const doMath = () => {
    if (number && storedNumber) {
      switch (functionType) {
        case '+':
          setStoredNumber(
            `${Math.round(`${(parseFloat(storedNumber) + parseFloat(number)) * 100}`) / 100}`
          );
          break;
        case '-':
          setStoredNumber(
            `${Math.round(`${(parseFloat(storedNumber) - parseFloat(number)) * 1000}`) / 1000}`
          );
          break;
        case '/':
          setStoredNumber(
            `${Math.round(`${(parseFloat(storedNumber) / parseFloat(number)) * 1000}`) / 1000}`
          );
          break;
        case '*':
          setStoredNumber(
            `${Math.round(`${parseFloat(storedNumber) * parseFloat(number) * 1000}`) / 1000}`
          );
          break;
        default:
          break;
      }
      setNumber('');
    }
  };

  return (
    <NumberContext.Provider
      value={{
        doMath,
        functionType,
        handleBackButton,
        handleClearValue,
        handleSetCalcFunction,
        handleSetDisplayValue,
        handleSetStoredValue,
        handleToggleNegative,
        number,
        storedNumber,
        setNumber,
      }}>
      {props.children}
    </NumberContext.Provider>
  );
};

export default NumberProvider;
    

Итоговое представление экрана

Обновим файл для отображения экрана. Он должен показывать number и storedNumber в соответствии с functionType. Еще есть несколько проверок, таких как отображение 0 при вставке пустой строки вместо числа.

Display.js
        import React, { useContext } from 'react';
import { NumberContext } from './NumberProvider';
import { DisplayStyles } from './styles/Styles';

const Display = () => {
  const { number, storedNumber, functionType } = useContext(NumberContext);
  return (
    <DisplayStyles>
      <h2>{!number.length && !storedNumber ? '0' : number || storedNumber}</h2>
      <p>{!storedNumber ? 'ENTER SOME NUMBERS' : `${storedNumber} ${functionType} ${number}`}</p>
    </DisplayStyles>
  );
};

export default Display;
    

Заключение

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

  • простой для понимания синтаксис и отсутствие беспорядка в компонентах класса. Больше никаких super и constructor – просто чистые переменные;
  • проще устанавливать и использовать состояние внутри компонентов и между ними;
  • нет необходимости в Redux для небольших проектов.

React Hooks и Context API – отличные
способы упростить приложения React и писать более чистый код. О других технологиях React читайте в нашем руководстве для React-разработчика.

09
Фев
2020

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

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

11
Янв
2020

6 идей проектов выходного дня

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

Кратчайшее расстояние между двумя точками – прямая. Скорейший способ освоить язык…