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

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

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



Недавно мы выпустили SberBox Time — умную медиаколонку (и по совместительству приставку для телевизора) с аналоговыми часами. Совмещение таких разных устройств в одном корпусе вывело задачу на новый уровень инженерной сложности. Как сделать отдельно колонку или отдельно часы — понятно. А вот как избежать влияния низких частот на чувствительный часовой механизм? Или как сделать так, чтобы farfield-микрофонам не мешало тиканье? Это уже вызовы, которые требуют особого подхода и исследования.

Или вот вам задача: как организовать настройку времени на аналоговом часовом механизме?

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

В посте я расскажу про разработку SberBox Time от идеи до серийного производства: про сложности, тупиковые прототипы и инсайты в процессе R&D.



Краткая история разработки: от идеи до полки в магазине


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

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

Также мы хотели, чтобы устройство не перетягивало на себя внимание и не нарушало домашний уют своим техновидом. Поэтому SberBox Time выглядит как привычные часы со стрелками — таким всегда найдётся место в доме. Аналоговые часы смотрятся стильно и солидно, неспроста в дорогих автомобилях устанавливают именно такие.

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

Устройство можно разместить на кухонном столе или прикроватной тумбочке и использовать как самодостаточную колонку. А можно пользоваться им в паре с телевизором как ТВ-приставкой — в таком сценарии возможностей ещё больше.





Мы даже инструкцию сделали необычную — разнесли эти две роли SberBox Time по двум сторонам документа, чтобы информацию было удобнее изучать.





Почему SberBox Time выглядит именно так


Работа над устройством начинается с дизайн-концепции. Над ней, как и над всеми процессами разработки дизайна, мы трудились вместе с нашим давним партнёром – дизайн-хаусом notAnotherOne.

Изначально мы рассматривали форму усечённого цилиндра, но впоследствии она трансформировалась:



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



И даже в форме адаптера питания:



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





Каталоги акустической ткани. Их малая часть.

Пробуем семплы ткани на прототипах:





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



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



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

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





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



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

«Железное» наполнение медиаколонки


«Железная» часть устройства тоже существенно менялась в процессе разработки.

Так выглядел наш первый «инженерный» прототип в акриловом корпусе:



Такие прототипы в акриловых корпусах стоят дёшево и просты в производстве. В отличие от «красивых» штучных образцов, которые делают в самом начале с помощью прецизионных станков с ЧПУ, акриловые легко собрать в нужном количестве на самом раннем этапе разработки. Это позволяет запустить параллельные процессы в разных командах, работающих над девайсом. Именно поэтому на старте мы обычно ищем решение с помощью такого Product Development Kit, чтобы не терять деньги и время.

Кстати, вот что у нас есть на основной плате:


Процессор S905D3, 16 Гб eMMC Flash-памяти, 2 Гб оперативной памяти

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

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

Часы


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

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

  1. Тихоходность. Многие пользователи любят успокаивающий шум на грани различимости, но не любят отчётливое тикание, особенно в спальне. Плюс нам нужно распознавать голос, и не хотелось бы, чтобы вместо этого микрофоны заглушал стук механизма.
  2. Устойчивость к вибрациям. Акустическая система при проигрывании музыки ощутимо вибрирует. Поэтому нужно было, чтобы часовой механизм был устойчив к таким вибрациям.
  3. Возможность программного управления механизмом. Мы хотели, чтобы часы работали не «сами по себе», а подчинялись «мозговому центру» девайса и могли по команде выставлять нужное время.
  4. Быстрая установка времени. Чтобы была возможность быстро и тихо «перематывать» стрелки в правильное положение при синхронизации с NTP-сервером на старте.
  5. Миниатюрность — в корпусе каждый кубический миллиметр очень дорог, ведь при его компактности нам нужно было разместить в нём достаточно много модулей: акустический модуль с динамиками, материнскую плату с теплоотводом и непосредственно сам часовой механизм. Тем более, что объём так важен для получения громкой музыки с глубоким басом.
  6. Качество механизма и адекватная цена. Нужно было найти производителя, который бы обеспечил отсутствие брака, стабильность параметров часового механизма во времени, низкий разброс параметров в разных экземплярах и т. д.

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

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

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



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

Уже на этапе выбора подходящего микроконтроллера стало понятно, что в условиях всеобщего дефицита чипов и заоблачных сроков поставок практически по всем линейкам ведущих производителей, выбирать придётся буквально из того, что есть. Финалистами стали микроконтроллеры серии PIC16 от Microchip и STM32G0 от STMicroeleсtronics: они устраивали нас как по цене, так и по встроенной периферии. В итоге выбор пал на чип от STMicroeleсtronics, так как только он был доступен в нужном нам количестве.

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

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

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

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

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


Осциллограммы управляющих сигналов на обмотках двигателя

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


Установка времени на SberBox Time при подключении к сети

Звук


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

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

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

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

Мы снова начали искать и тестировать разные концепции акустической системы: акустическая камера с фазоинвертором, камера с пассивным излучателем, с одним и двумя разными динамиками.


Разные модели аудиомодуля, победил первый вариант

Некоторые прототипы акустических систем, которые мы напечатали на 3D-принтере:





Тестируем звук:





В итоге пришлось изменить всю начинку: мы поставили новые динамики, изменили форму и объём акустической камеры, добавили пассивный излучатель и адаптировали настройки эквалайзера под новый акустический дизайн, а также — систему DRC усилителя (англ. Dynamic Range Control). И всё это — оставаясь в рамках утверждённого не только внешнего дизайна, но и внутреннего пространства, отведённого под звуковой модуль. Это решение отбросило нас на четыре месяца назад, но в итоге мы получили именно то, что хотели: мы добились глубоких басов и менее 1% нелинейных искажений при звучании на 90% громкости.

Если уровень нелинейных искажений высокий, возникают паразитные гармоники и различные резонансные эффекты, дребезги. А высокая громкость только усугубляет эту ситуацию. Такие артефакты портят всё впечатление от устройства: и музыка звучит не так, и ассистенты реагируют хуже, потому что алгоритм подавления эха (Acoustic Echo Cancellation) не может работать как нужно. Задача AEC — вычитать из микрофонного сигнала тот звук, который проигрывает само устройство, чтобы слышать только окружающую звуковую обстановку. В нашем случае ключевое слово (spotter) — «Салют», «Афина», «Джой» или «Сбер», произнесённое пользователем. AEC работает за счёт обратной связи, когда сигнал с выхода усилителя поступает обратно в SoC (System-on-Chip – процессор) через цепочку аттенюатора сигнала и АЦП. А если звук из динамиков воспроизводится с высокими нелинейными искажениями, система AEC не способна полностью вычесть его из микрофонного сигнала и получается звуковая неразбериха, из которой алгоритм детектирования ключевых слов попросту не может определить, что пользователь произнёс заветное слово.


Финальная акустическая система

Микрофоны


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

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

У нас, условно, два основных сценария использования звука с микрофонов: это постоянный анализ фона с помощью алгоритма-споттера, который ждёт команду на пробуждение устройства (слова «Салют», «Афина», «Джой» или «Сбер»), и использование звука с микрофонов уже внутри приложений. Обе задачи предъявляют определённые требования к микрофонам по АЧХ, рабочему диапазону частот, соотношению сигнал/шум и чувствительности. Вот что происходит, когда звучит слово-споттер с другого конца комнаты при играющей музыке. Все пять микрофонов (два из них расположены рядом с кнопкой Mute, остальные три – под кольцом, обрамляющим циферблат) улавливают всё, что происходит вокруг. Это и голос человека, и звук из динамиков устройства или телевизора, и другие шумы в помещении. Затем цифровой сигнал обрабатывается набором алгоритмов, таких как Beamforming, AEC, Dereverberation, Noise reduction, которые призваны убрать всё лишнее и оставить только голос человека. Так алгоритм AEC вычитает референсный звук, который в моменте проигрывается через динамики, из сигнала с микрофонов. Также задействуются алгоритмы для очистки сигнала от посторонних шумов, удаления реверберации и другие. После того как сигнал очищен, он подаётся на вход споттер-алгоритма, который работает на базе нейронной сети и распознаёт слово-активатор.


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

И вот ещё — на одном из прототипов:



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

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

У нас отклонение микрофонов по чувствительности не хуже ±1 дБ. Для сравнения — обычный аналоговый электретный микрофон имеет отклонение чувствительности порядка ±3 дБ. А всего несколько лет назад нормой для MEMS было около ±2 дБ. Большая часть алгоритмов работает нестабильно уже при отклонении чувствительности ±2 дБ.

Отдельно стоит сказать про кнопку отключения микрофонов. Вот она, на верхней части устройства:



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



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

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

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


После сборки мы тестируем каждое устройство, сошедшее с производственной линии, в специальных тестовых камерах — чемберах. Комплексное тестирование проходит в автоматизированном режиме, без участия людей, и длится несколько минут для каждого устройства. За это время проверяется работа системы в целом, работа часового механизма, периферии (подключается ли медиаколонка к WI-FI и Bluetooth), замеряются параметры микрофонов, звука, также тестируются кнопки. Если были обнаружены какие-то дефекты, устройство отправляют обратно на производственную линию для устранения проблем, а после снова прогоняют через чембер — и так до момента, пока всё не будет работать корректно на 100%.

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

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

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


Камера для тестирования устройств

А как же пандемия? Не повлияла на разработку?


Повлияла. Как и, наверное, на процессы всех производителей устройств сегодня. На всём пути разработки девайса нас не покидала проблема роста себестоимости: поставщики компонентов постоянно поднимали цены, некоторые выросли чуть ли не вдвое за время разработки. Нам приходилось постоянно искать компромиссы, подбирать аналоги, менять поставщиков, вносить изменения в прототипы. Некоторые компоненты в принципе пропали с рынка, по некоторым сроки поставок увеличились от нескольких месяцев вплоть до года. Так что скилл планирования мы прокачали неплохо: производство, логистику, закупку, бронирование производственных линий. Их приходилось планировать на 25–30 недель вперёд. Сейчас этот срок стал ещё больше и доходит до 50–60 недель.

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

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



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

А пока узнать больше о сценариях использования SberBox Time можно здесь. И там же — приобрести медиаколонку, если вам захотелось попробовать её в деле.
Источник: https://habr.com/ru/company/sberdevices/blog/647071/


Интересные статьи

Интересные статьи

The Elephant House в Эдинбурге — кафе, в котором Джоан Роулинг писала «Гарри Поттера» Некоторые из самых успешных людей в истории лучше всего работали в кофейнях. Пабло Пикассо, Джоан Роулинг, Си...
Инвертор Tesla Model 3, содержащий чипы из карбида кремния. Изобилие легко обрабатываемого кремния десятилетиями было основным материалом в полупроводниковой промышленности, но электромобили по...
Паша Шишкин из «Карьерного цеха» рассказал о своем кейсе на Bubble — без цензуры. Он продакт, в бэкграунде — разработка и даже победа в Чемпионате мира по программировани...
Привет! Я старший UI-дизайнер Pixonic, Алексей Морев. И в этой статье речь пойдет UI-анимациях, которые каждый из нас может увидеть в играх. Игровой интерфейс — это совокупнос...
Сегодня мы с вами разберемся в следующем: что за метод такой Array.isArray(), как он устроен под капотом, что изменилось с ним после выхода ES6, почему он возвращает для Array.prototy...